wie greife ich auf eine Funktion zu in einer anderen Klasse



  • Hi !

    Ich habe einen Dialog in der Klasse CBuchenView

    In der anderen Klasse CMessage ist eine Funktion

    CMessage::OnButton7()
    

    , die ich ausführen möchte.

    Beim Ausführen des Programms sagt es mir aber, dass es sich um einen nichtdeklarierten Begriff handelt.



  • Also mit den Angaben kann man nicht viel sagen!
    Poste mal ein wenig Code oder gib wenigstens an, wo und wie die Klassen und die zugehörigen Variablen deklariert sind!

    Gruß WinCoder



  • Das hat nichts mit MFC sondern mit Grundlagen von C++ zu tun.



  • Dieser Thread wurde von Moderator/in Unix-Tom aus dem Forum MFC mit dem Visual C++ in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Also hier auf besonderen Wunsch ein bischen Code:

    Ich habe mir mit dem MFC Klassenassistenten eine Anwendung erstellt.

    In CBuchenView liegt der Hauptdialog. Dieser Dialog hat einen Button.

    Wenn ich den anklicke öffnet sich ein Dialog aus einer anderen von mir erstellten Klasse CMessage

    Dieser Dialog in CMessage hat einen Button OnButton3(), der eine Funktion in der Klasse CBuchenView ausführen soll

    void CMessage::OnButton3() 
    {
    OnButton54();
    }
    

    Aber das ausführen vom zweiten Dialog klappt nicht, so als ob das Programm den button54() nicht kennt.

    Das ist das Problem.

    Und bitte nicht schon wieder diesen Beitrag verschieben, weil es doch MFC ist !!!

    void CBuchenView::OnButton54() 
    {
     ....... ( Programmcode )
    }
    


  • Woher soll der compiler wissen welche methode du da aufrufst.

    In der form wie du es machst, nimmt er an dass es sich bei OnButton54 um eine methode der klasse CMessage handelt, oder eine andere funktion die zu keiner klasse gehört.

    Wenn du die OnButton54 methode von CBuchenDialog aufrufen möchtest, dann brauchst du einen Referenz, einen Zeiger oder sogar den Dialog selbst in der CMessage-klasse. Nehmen wir an du hättest einen zeiger auf CBuchenDialog dann rufst du dessen OnButton54-methode folgendermaßen auf:

    void CMessage::OnButton3(){
      ptr_to_cbuchen->OnButton54();
    }
    

    Kann natürlich nicht schaden zu prüfen ob der zeiger gültig ist.

    sofar



  • Der Button54 ist ja in CBuchenView - von dort aus klappt ja auch der Aufruf

    Auch den zweiten Dialog in CMesaage kann ich aufrufen aus CBuchenView da ich mir in CBuchenView folgende Membervariable erstellt habe:

    CMessage m_dlg;
    

    Nur wenn ich im zweiten Dialog bin und

    OnButton54()
    

    aufrufe meckert dass Programm



  • Das hab ich doch grade geschrieben. Die methode ist in CBuchenView aber du versuchst sie in CMessage::OnButton3() aufzurufen ohne einen verweis auf eine instanz von CBuchenView. CMessage braucht einen zeiger oder eine reference (member fällt aus weil sie dann gegenseitig member von sich wären) auf CBuchenView.

    Und dann kannst du sie auch aufrufen.



  • Davon ab: glaubst du dass du übernächste Woche noch weisst was Button54 macht? Wofür Button3 steht? Button7?
    Denk dir mal ordentliche Bezeichner aus.



  • Aha !

    Dann nenn ich den Zeiger z.B.: ptr

    ptr->OnButton54();
    

    Aber auch hier wird das Programm meckern - irgendwo im Quellcode muss ich doch den ptr bekannt machen ?



  • Genau,

    du könntest den ptr mit einem setter oder per ctor übergeben.

    CMessage braucht dann einen member der ein pointer auf CBuchenView ist.

    class CBuchenView;
    class CMessage : public mfckram{
       public:
          CMessage(CBuchenView *ptr):ptr_to_buchen(ptr){}
       private:
         CBuchenView *ptr_to_buchen;
    
    };
    
    class CBuchenView : public andrermfckram{
      public:
        CBuchenView() : msg(this) {}
      private:
        CMessage msg;
    };
    

    So in etwa


Anmelden zum Antworten