steinadler Geschrieben 14. Juni 2006 Geschrieben 14. Juni 2006 Hallo, in meinem Programm gibt es ein Array von n Objekten einer Klasse (angenommen class CTestClass). In einer Funktion lege ich von CTestClass ein Objekt an, und da das ja theoretisch nach Beenden der Funktion aus dem Speicher verschwindet, möchte ich das Objekt in das o. g. Array kopieren. Meine Frage: Reicht da ein = zu? Also: myArray[x] = myObject; Oder wird da nur ein Pointer übergeben, welcher nach Beenden der funktion ins Leere zeigt, da das Objekt nicht mehr im Speicher vorhanden ist...?
Klotzkopp Geschrieben 14. Juni 2006 Geschrieben 14. Juni 2006 Reicht da ein = zu?Das kommt auf die Definition von CTestClass an. Wenn du selbst keinen Zuweisungoperator definierst, erstellt der Compiler automatisch einen. Der weist aber nur Member für Member zu. Wenn deine Klasse dynamisch Speicher anfordert, musst du einen eigenen operator= schreiben, damit das klappt.
steinadler Geschrieben 14. Juni 2006 Autor Geschrieben 14. Juni 2006 Also würde das so wie ich es geschrieben habe an den Baum gehen, oder?
Kratzy974 Geschrieben 14. Juni 2006 Geschrieben 14. Juni 2006 Ja, es würde für eine Klasse gehen, welche keinen eigenen Speicher mit new oä allokalisiert. Jedoch würde ich immer einen operator = schreiben, damit nicht in Zukunft, wenn die Klasse geändert wird unerklärliche Probleme auftreten.
Klotzkopp Geschrieben 14. Juni 2006 Geschrieben 14. Juni 2006 Also würde das so wie ich es geschrieben habe an den Baum gehen, oder?Ich weiß nicht, was du mit "an den Baum" meinst. Ob das geht, hängt davon ab, wie die Klasse aussieht. Und das hast du bisher nicht verraten. Wie Kratzy974 schon sagte, wenn du dynamisch Speicher anforderst, musst du einen eigenen Zuweisungsoperator für die Klasse schreiben, damit das klappt.
steinadler Geschrieben 14. Juni 2006 Autor Geschrieben 14. Juni 2006 Und wie macht man sowas mit nem eigenen Zuweisungsoperator? (MSDN-Link?)
Klotzkopp Geschrieben 14. Juni 2006 Geschrieben 14. Juni 2006 Und wie macht man sowas mit nem eigenen Zuweisungsoperator? (MSDN-Link?)Auch das kommt drauf an, wie deine Klasse aussieht. Ein Zuweisungsoperator ist eine Memberfunktion, die üblicherweise so aussieht: CTestClass& operator=(const CTestClass& rhs) { // Zuweisung, z.B. mit Copy&Swap return *this; }[/code] Es gibt übrigens eine Regel, die besagt, wenn man einen der "großen drei" (Destruktor, Copykonstruktor, Zuweisungsoperator) braucht, braucht man alle drei. [i]Ob[/i] du überhaupt einen brauchst, hast du übrigens immer noch nicht verraten .
Kratzy974 Geschrieben 14. Juni 2006 Geschrieben 14. Juni 2006 Kleine Ergänzung : CTestClass const& operator=(const CTestClass& rhs) { // Zuweisung, z.B. mit Copy&Swap return *this; } [/PHP] da sonst (test = test2) = test 3 funktionieren würde, was im Fehlerfall in if statements passieren kann (beim vertippen von = statt ==)
Klotzkopp Geschrieben 14. Juni 2006 Geschrieben 14. Juni 2006 Du hast mit deinem Einwand Recht, aber genau zu diesem Thema: declare copy assignment as "T& T::operator=(const T&)" - don't return const T&; although this would be nice since it prevents usage like "(a==c", it would mean you couldn't portably put T objects into standard library containers, since these require that assignment returns a plain T& Quelle: http://www.gotw.ca/gotw/023.htm Ich bin geneigt, Herrn Sutter hier zuzustimmen
Kratzy974 Geschrieben 14. Juni 2006 Geschrieben 14. Juni 2006 Ahh, das ist eine gute Erklärung. Zwar tauchten bei mir noch keine der Probleme mit STL containern auf, aber habe auch nicht auf allen Compilern gearbeitet. Den operator = habe ich dennoch lieber nach Meyer implementiert (bis auf das const) TestClass& operator = (TestClass const& obj) { TestClass newObj(obj); this->swap(newObj); return *this; } [/PHP] ... so und nu los, einigen Sourcecode umschreiben *g*
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden