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