Eine friend-function ansprechen?



  • Hi,
    Also ich will mit einem Klick auf einer Schaltfläche (gehört zur "Klasse2") eine Funktion "protected_fct" ausführen.
    Diese Funktion befindet sich in der "Klasse1" und ist als protected dort deklariert:
    class Klasse1
    {
    ...
    protected:
    void protected_fct ();
    ...
    };

    Ich habe diese Funktion in der "Klasse2" wo ich sie benutzen möchte als freind deklariert:

    class Klasse2
    {
    ...
    public:
    friend void protected_fct ();
    ...
    };

    Die Frage ist nun wie kann ich im Code meiner Schaltfläche die "protected_fct()" ansprechen?
    mit: Klasse1.protected_fct(); hat es nicht geklapt :p ???

    So, ich hoffe dass mir hier geholfen wird und dafür kriegt ihr den besten Dank der Welt 😃



  • Du hast das friend falsch herum angewendet - mit dieser Konstruktion erhält eine globale Funktion 'protected_fct()' Zugriff auf die private/protected Elemente vom Klasse2. Was du (vermutlich) brauchst, sieht so aus:

    class Klasse2
    {
    public:
      void accessor();
      ...
    };
    
    class Klasse1 
    {
    public:
      ...
      friend Klasse2;
      //oder
      friend void Klasse2::accessor();
    protected: 
      void protected_fct (); 
      ... 
    };
    

    (Den Zugriff nur auf einzelne Elemente/Methoden beschränken geht nicht - wenn friend, dann komplett)

    PS: Das hat aber wenig mit MFC zu tun.



  • Dieser Thread wurde von Moderator/in CStoll aus dem Forum MFC (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.



  • Ok, aber in dem Code der Schaltfläche (mit dem Klassenassistent) wie kann ich denn die protected_fct() aufrufen?
    Ich habe jetzt in

    class Klasse2 
    { 
    protected: 
      void fct_aufrufen(); 
      ... 
    }; 
    
    class Klasse1 
    { 
    public: 
      ...  
      friend void Klasse2::fct_aufrufen(); 
    protected: 
      void protected_fct (); 
      ... 
    };
    
    ...
    
    void fct_aufrufen(){
    
        Klasse1.protected_fct (); //So funktioniert es leider nicht???
    }
    


  • Du mußt dir irgendwo auch ein Objekt besorgen, dessen Methode du aufrufen willst (jede nicht-statische Methode benötigt einen this-Zeiger):

    void Klasse2::fct_aufrufen()
    {
      Klasse1 ob1;
      ob1.protected_fct();
    }
    

    (eventuell kannst du das Objekt auch als Element von Klasse2 anlegen oder beliebig herumreichen - hängt davon ab, wo du es brauchst)



  • Mal philsophisch ausgedrückt:

    • Die Klasse, die "sich offenbaren" will, muss angeben, wen sie "sehen lassen" möchte. Es kann nicht eine Klasse2 entscheiden, dass sie gerne in Klasse1s "privates" schauen will. ("friend" = "Genehmigung in meine privates zu gucken")

    void fct_aufrufen(){

    ....protected_fct (); //So funktioniert es leider nicht???
    

    }

    
    Wen willst Du "protected_fct-en" ? Konkret arbeitet man nicht mit Klassen, sondern mit Objekten, deren Layout man in einer Klasse festlegt.
    
    Gruß,  
    
    Simon2.

Anmelden zum Antworten