Freunde



  • Hey ihr,

    2 Klassen.
    Die eine ist mit einer Elementfunktion der anderen befreundet.
    Die Elementfunktion der einen, soll die private Variable der anderen ändern:

    #include <iostream> 
    class B
    {
       public:
          void change_x(int);       
    };
    class A
    {
       friend void B::change_x(int);
       private:
          int x;
    };
    void B::change_x(int y)
    {
       A::x = y;
    }
    int main(void)
    {
       B foo;
       A foo2;
       B.change_x(3);   
    }
    

    Dummerweise lässt sich dieser Code nicht kompilieren.
    Zeile 11 meldet den Fehler:

    11 C:\Dokumente und Einstellungen\Praktikant\Eigene Dateien\Test\zweiundvierzig.cpp object missing in reference to `A::x'
    

    In meinem Buch wird das Problem auf ne komische Art und Weise gelöst:

    1 Befreundete Klasse: Window_Mgr
    2 Klasse: Screen

    ...

    friend Window_Mgr&
    Window_Mgr::relocate(Window_Mgr::index, 
    Window_Mgr::index, 
    Screen&)
    

    ...

    Ich versteh aber die erste Zeile nich?
    Muss immer noch das Objekt mit Adressoperator vorrangestellt werden?
    Wo liegt der Fehler?

    cya
    David



  • Der Fehler liegt daran, daß die Freund-Methode auch ein Objekt benötigt, auf dessen private Daten sie zugreifen kann. (woher es dieses Objekt bekommt, ist egal - in deinem Buch wird es als dritter Parameter an die Funktion übergeben)

    btw hat dein Problem überhaupt nichts mit friend's zu tun 😉 Du kannst ja auch nicht einfach so etwas schreiben:

    struct data
    {
      int x;
    };
    
    data::x = 4711;
    


  • du verwechselst durchgehend klassen mit instanzen.
    eine klasse ist nur eine vorlage, eine schablone, von der ausgehend dann unterschiedliche objekte, instanzen, gemacht werden können. die klasse A "besitzt" selbst keinen integer, sie normiert nur, dass jede instanz der klasse A eine integervariable als member enthalten soll.

    änderungen kommentiert.

    #include <iostream> 
    class A; //deklaration von A, um eine referenz zu ermöglichen
    
    class B
    {
       public:
          void change_x(int, A &); //die funktion muss ja wissen, von welcher instanz sie den integer ändern soll.       
    };
    
    class A
    {
       friend void B::change_x(int);
       private:
          int x;
    };
    
    void B::change_x(int y, A &a)
    {
       a.x = y; //und zwar von der instanz, die übergeben wird.
    }
    
    int main(void)
    {
       B foo;
       A foo2;
       //B.change_x(3); - wieder einmal: B ist nur die beschreibung
       //richtig:
       foo.change_x(3, foo2);
    }
    

    oder, falls du tatsächlich eine integervariable für _alle_ instanzen brauchst, deklariere sie "static". aber ich glaube fast, das willst du nicht.



  • ahh... ja ihr habt recht- da muss natürlich der .-Operator verwendet werden.
    Dein Beispiel funktioniert.
    Bis das du bei einer Definition den 2. Paramter nicht geändert hast- aber egal^^
    Thx


Anmelden zum Antworten