Klasse mit Instanz derselben Klasse konstruieren?
-
Ich würde gerne sowas machen:
LaserdynamicBasics::LaserdynamicBasics(LaserdynamicBasics * basics) { this = basics; }anstatt alles von Hand zu kopieren
LaserdynamicBasics::LaserdynamicBasics(LaserdynamicBasics * basics) { m_T = basics->m_T; m_dt = basics->m_dt; N = basics->N; m_Ns = basics->m_Ns; ... }ersteres gibt aber den Fehler
error C2106: '=': Linker Operand muss ein L-Wert sein
geht sowas überhaupt?
-
class LaserdynamicBasics { public: LaserdynamicBasics(LaserdynamicBasics *basics); ~LaserdynamicBasics(); private: LaserdynamicBasics *pBasics; };LaserdynamicBasics::LaserdynamicBasics(LaserdynamicBasics *basics) { pBasics = basics; }du versuchst dem this zeiger (ein objekt welches auf sich selber zeigt) einen L wert zu übergeben. das macht keinen sinn, weil der this zeiger nicht das objekt selber ist, sondern der zeiger der auf das instanziierte objekt zeigt.
this->var = var2;macht sinn. damit wird der variable "var" des objektes auf das zugegriffen wird, der wert von var2 zugewiesen.
-
übrigens, wenn ich das richtig sehe, wirst du damit aber dem konstruktor nie ein gültiges objekt übergeben können. du kannst von der klasse LaserdynamicBasics nur dann eine instanz erzeugen, wenn du ein objekt der klasse LaserdynamicBasics als parameter übergibst. wie soll das funktionieren?
-
Das kann C++ schon von selbst, nennt sich Copy-Constructor.
class Dog { public: Dog( int leg_count ) : m_leg_count(leg_count) { } int getLegCount() const {return m_leg_count;} private: int m_leg_count; }; int main() { Dog rex( 4 ); Dog bello( rex ); assert( bello.getLegCount() == 4 ); // Oder mit Zeigern: Dog* wuff1 = new Dog( 5 ); Dog* wuff2 = new Dog( *wuff1 ); assert( wuff2->getLegCount() == 5 ); delete wuff1; delete wuff2; }Die Deklaration für einen Copy-Constructor sieht übrigens so aus:
class T { T( const T& ); };edit: Der Copy-Constructor wird immer automatisch generiert, außer du deklarierst ihn selbst.
-
Default Copy Konstruktoren können allerdings nicht problemlos mit "komplexen Datentypen" umgehen. Hat dein Hund zB ein Array von 4 Beinen, die selbst der Klasse "Leg" angehören, so kann es zu unerwarteten Ergebnissen kommen, wenn du nicht selbst einen Copy-Konstruktor programmierst.
-
würmchen schrieb:
LaserdynamicBasics::LaserdynamicBasics(LaserdynamicBasics *basics) { pBasics = basics; }Das das geht ist mir schon klar. Nur halt nicht das was ich wollte.
würmchen schrieb:
übrigens, wenn ich das richtig sehe, wirst du damit aber dem konstruktor nie ein gültiges objekt übergeben können. du kannst von der klasse LaserdynamicBasics nur dann eine instanz erzeugen, wenn du ein objekt der klasse LaserdynamicBasics als parameter übergibst. wie soll das funktionieren?
Weil es noch einen weiteren Standard Konstruktor gibt. Sonst geht es natürlich nicht da hast du Recht.
Badestrand schrieb:
Das kann C++ schon von selbst, nennt sich Copy-Constructor.
Im Grunde genommen mache ich nichts anderes wie einen Copy Constructor (im zweiten Beispiel)
-
pospiech schrieb:
Ich möchte nicht etwas anderes zu einer Kopie von mir selbst machen, sondern mich selbt auf die Instanz von etwas anderem Verweisen. Also der Pointer auf die Klasse soll auf eine andere Instanz der Klasse zeigen.
Wie soll das gehen?
class Class { Class( Class* x ) { this = x; } }; int main() { Class* the_original = new Class; Class* the_copy = new Class( the_original ); // the_copy und the_original sollen nun identisch sein? Obwohl da zweimal NEW steht? // irgendwie würde das massiv dem widersprechen, was ich grad vom Compiler // verlangt habe, nämlich zwei Objekte zu erzeugen. }
-
LordJaxom schrieb:
pospiech schrieb:
Ich möchte nicht etwas anderes zu einer Kopie von mir selbst machen, sondern mich selbt auf die Instanz von etwas anderem Verweisen. Also der Pointer auf die Klasse soll auf eine andere Instanz der Klasse zeigen.
Kein Ahnung, wo das Zitat herkommt, aber in diesem Fall solltest du dir vielleicht mal das Singleton Pattern ansehen - das entspricht gff in etwa deinen Wünschen.
Grüße,
Daniel
-
LordJaxom schrieb:
pospiech schrieb:
Ich möchte nicht etwas anderes zu einer Kopie von mir selbst machen, sondern mich selbt auf die Instanz von etwas anderem Verweisen. Also der Pointer auf die Klasse soll auf eine andere Instanz der Klasse zeigen.
Wie soll das gehen?
Garnicht

@pospiech: der this-Pointer zeigt IMMER auf die Instanz selbst und kann nicht auf eine andere Instanz verweisen.
Wenn ich das richtig verstehe möchtest du, dass dein neues Objekt nicht die Interna des Originals kopiert sondern auf die selben Interna verweist. Das simpelste wäre, nicht ein neues Objekt der Klasse zu erstellen sondern sowas wie shared_ptr auf die Klasse zu verwenden. Ähnlich wäre es, wenn du statt der einzelnen Daten in der Klasse ein Daten-struct definierst und die Pbjekte halten jeweils einen smart Pointer auf ein solches struct.