Zuweisungsoperator überladen bzw. Kopierkonstruktor bei verwalteter Klasse
-
Hallo,
ich habe folgendes Problem:
Wenn ich ein Objekt meiner verwalteten Klasse einem anderen zuweise (obj1 = obj2), dann verweisen beide Trackinghandle nachher auf dasselbe Objekt.
Wie kann ich es erreichen, dass obj2 kopiert wird?Das müsst doch eigentlich über das Überladen des "="-Operators gehen, aber wie?
MfG
edit:
2. Möglichkeit: Kopierkonstruktor
Aber wie kann ich in diesem (einfachen) Beispiel einen Kopierkonstruktor einbauen?
Oder von mir aus auch den "="-Operator überladen?using namespace System; ref class myClass { String^ str; public: myClass(String^ s) { str = s; } property String^ myString { String^ get() { return str; } void set(String^ s) { str = s; } } }; int main() { myClass^ mC1 = gcnew myClass("Text1"); myClass^ mC2; mC2 = mC1; mC2->myString = "Text2"; System::Console::WriteLine(mC1->myString); }
In diesem Beispiel wird "Text2" auf der Konsole ausgegeben. Ich will aber, dass mit
mC2->myString = "Text2";
nur mC2 und nicht mC1 geändert wird.
Wie kann ich das erreichen?
-
Hy,
Hab grad leider keinen Editor zur Hand, aber so in etwa gehts:
ref class myClass { String^ str; public: myClass(String^ s) { str = s; } myClass(myClass^ m) { // <-- dies ist ein Copy Kontruktor // Hier alle Daten kopieren die "nur" referenzen sind, und keine // "direkten" Daten... str = new String(m->str); } property String^ myString { String^ get() { return str; } void set(String^ s) { str = s; } } };
Hoffe es funktioniert so.
Mfg Marc-O
-
Klassische Copy- Construktor und Assignment- Operator werden in C++/CLI nicht gebraucht. Das gewünschte Verhalten sollte mit einer Clone(..) Methode bzw. dem Interface IClonable erreicht werden.
Jedoch würde bei deinem Code auch im nativen Fall (myClass* od. myClass&) kein Zuweisungs- Operator oder Copy- Konstruktor aufgerufen.
Habe desshalb eher das Gefühl, dass der Umgang mit Pointern/ Referenzen/ Objekten gelernt werden sollte.
Simon
-
Und wenn man dies tut, gleich das hier mitlesen:
http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=copyvsdirect#Answ
-
simon.gysi schrieb:
Das gewünschte Verhalten sollte mit einer Clone(..) Methode bzw. dem Interface IClonable erreicht werden.
Wie genau?
-
-
Das ist die große Kunst
Das Interface gibt dir die Clone Methode vor die du implementieren musst. Im Prinzip erstellst du ein neues Objekt deiner Klasse, setzt alle relevanten Properties mit den Werten deines aktuellen Objektes und gibts dieses neu erstelle Objekt zurück.
Klingt einfach, ist aber tückisch denn dieses Wort "Wert" eines Properties, hat es in sich. Wenn du nur Value Types und immutable Reference Types wie z.B. string verwendest machst du im Prinzip nur ne Zuweisung und der Wert wird kopiert. Alles bestens, hast du aber Reference Types wirds tricky. Dann ist nämlich die Frage ob du ne shallow oder ne deep Copy haben möchtest. Bei ersterem reicht wieder die einfache Zuweisung, bei zweiteren musst du im Prinzip auch die einzelnen Properties deiner Klasse Clonen. Und da kanns jetzt richtig blöd sein da die eventuell gar kein Deep Copy anbieten und im Endeffekt hast du vielleicht ein Objekt das bis zu xten Ebene wirklich kopiert wurde, aber dadrunter werden trotzden Referenzen geshared. Es gibt in .Net keine Möglichkeit beliebige Reference Types zu klonen. Der Abschnitt sollte grad nur die Problematik aufzeigen, nicht verschrecken, Referenzen muss man so gut wie nie in .Net klonen, meist ist dass dann ne Unzulänglichkeit im Design. Und ValueTypes lassen sich wie gesagt einfach kopieren.