Kopierkonstruktor HowTo
-
Hallo!
Wenn ich mir den Kopierkonstruktor so definiere:
// MyClass.h MyClass(const MyClass &rhs); // MyClass.cpp MyClass::MyClass(const MyClass &rhs) { }Wie übernehme ich die Werte aus rhs in das Objekt?
Wenn ich this->attribut = rhs.get_attribute() schreibe (die Verfügbarkeit der Methode get_attribute() vorausgesetzt), dann gibts den Fahler:error C2662: 'MyClass::get_attribute': this-Zeiger kann nicht von 'const MyClass' in 'MyClass &' konvertiert werden
Kann mir wer helfen?
Grüße, pktm
-
Ist denn get_attribute() const ? Das sollte sie schon sein.
Wozu hier überhaupt eine Zugriffsfunktion?
-
wahrscheinlich ist deine Methode get_attribute () nicht const?!
btw initialisierungsliste:MyClass::MyClass(const MyClass &rhs) : m_eins (rhs.m_eins), m_zwei (rhs.GetBla ()), m_drei (4) /*, ...*/ { //ist bei mir meist leer, weil man fast alles in der initialisierungsliste machen kann }
-
pktm schrieb:
Hallo!
Wenn ich mir den Kopierkonstruktor so definiere:
Mach das einfach so:
// MyClass.h MyClass(MyClass const& rhs); // MyClass.cpp MyClass::MyClass(MyClass const& rhs) : attribute (rhs.attribute) { }
-
Braunstein schrieb:
Ist denn get_attribute() const ? Das sollte sie schon sein.
Wozu hier überhaupt eine Zugriffsfunktion?Hm nein, ist sie nicht. Macht es denn Sinn? Es ist eine Getter-Methode auf ein Attribut. Wozu macht man Methoden const?
-
~john schrieb:
pktm schrieb:
Hallo!
Wenn ich mir den Kopierkonstruktor so definiere:
Mach das einfach so:
// MyClass.h MyClass(MyClass const& rhs); // MyClass.cpp MyClass::MyClass(MyClass const& rhs) : attribute (rhs.attribute) { }Ja, hörrt sich gut an.
Kann ich denn einfach so auf private Atrribute zugreifen?
*ausprobiergeh* => jepp
-
pktm schrieb:
Braunstein schrieb:
Ist denn get_attribute() const ? Das sollte sie schon sein.
Wozu hier überhaupt eine Zugriffsfunktion?Hm nein, ist sie nicht. Macht es denn Sinn? Es ist eine Getter-Methode auf ein Attribut. Wozu macht man Methoden const?
Eine const Methode zeigt an, daß das Objekt nicht verändert wird(werden kann). Ein Getter ändert grundsätzlich nicht den Wert eines Objekts, daher ist es sinnvoll diesen const zu definieren.
-
Falls der Copy-ctor am Ende so aussieht:
MyClass::MyClass(MyClass const& rhs) : x(rhs.x),y(rhs.y),z(rhs.z){}können wir auf die Definition eines eigenen Konstruktors gleich verzichten.
-
const bei Methoden führt dazu, dass die Methode keine Änderungen an der Klasse durchführen kann. Dies ist bei GetXY()-Methoden sinnvoll.
Konstante Methoden haben folgende Syntax (merke dir, const nach dem Funktionsnamen zu schreiben):
int GetInt() const;Edit: war schon jemand schneller

Edit2: Semikolon vergessen *grr*
-
camper schrieb:
Falls der Copy-ctor am Ende so aussieht:
MyClass::MyClass(MyClass const& rhs) : x(rhs.x),y(rhs.y),z(rhs.z){}können wir auf die Definition eines eigenen Konstruktors gleich verzichten.
Ah, danke für das mit dem const.
Wieso kann ich gleich auf den Konstruktor verzeichten? Gibts den per default?
-
Ja.
-
Ja, wenn du keinen eigenen schreibst, wird vom Compiler ein Kopierkonstruktor erzeugt. Manchmal ist es allerdings sinnvoll, einen spezifischen zu implementieren, z.B. wenn Zeiger im Spiel sind, oder wenn bei der Kopie eines Objektes noch etwas Spezielles passieren soll.
-
pktm schrieb:
Ja, hörrt sich gut an.
Kann ich denn einfach so auf private Atrribute zugreifen?
*ausprobiergeh* => jepp
Innerhalb der Klasse selbst kannst Du immer auf alle Attribute zugreifen. Auf Attribute der Elternklasse nur dann wenn sie protected oder public sind, aus anderen Klasse nur, wenn sie public sind. Ergänzend geht es noch, wenn eine Funktion, Methode oder Klasse als friend deklariert wurde.
Die Initialisierung via Getter Methode ist nur unter ganz bestimmten Fällen sinnvoll, und dann muß sie hierfür const deklariert sein.
// .h MClass { int attribute; public: MyClass(); MyClass(MyClass const& rhs); int get_attribute() const; // Konstante Methode }; // .cc MyClass::MyClass (MyClass const& rhs) : attribute (rhs.get_attribute()) {}