Kopier-Operationen: Defaultverhalten mit Anpassungen
-
Die Schleife als solche ist nicht das Problem (und von Hand geschrieben einfacher als wenn ich noch einen Funktor für for_each() zusammenbauen müsste), das Problem ist es, das Default-Verhalten von op= um diese Schleife zu erweitern.
-
gibts überhaupt die möglichkeit, dass nen default copy-ctor pointer anfasst?
ne variante wäre, die child/parent beziehung an einen controller auszulagern, der objekte nicht anhand ihrer adresse, sondern einer eindeutigen ID identifiziert.
-
hola
du koenntest die beiden doch trennen. nen teil den std-ctor machen lassen und den container selber machen
class koloss; class part { ... koloss* parent; }; //hier deine vielen kleinen hilfsmember struct hilfsmember { int irgendwas; ... }; class koloss { //viele kleine Hilfsmember hilfsmember member; vector<part> m_parts; ... public: koloss(const koloss &k) : member(k.member) { // hier das manuelle kopieren des kontainers mit parent-berichtigung } };musst deine members nur in der struct 'hilfsmember' aendern oder hinzufuegen
oder vielleicht ne kleine vererbung:
class koloss; class part { ... koloss* parent; }; class koloss_privat { // deine member }; class koloss : public koloss_privat { public: koloss(const koloss &k) : koloss_privat(k) { // hier das manuelle kopieren des kontainers mit parent-berichtigung } }hier halt deine hilfsmember in der koloss_privat hinzufuegen oder aendern
oder hab ich das thema verfehlt ?
Meep Meep
-
@Meep Meep : Ich glaube, CStoll meint die Klasse 'part', aber generell ist dein Ansatz ziemlich gut.
-
Th schrieb:
@Meep Meep : Ich glaube, CStoll meint die Klasse 'part', aber generell ist dein Ansatz ziemlich gut.
wenn er die klasse 'part' meint, dann seh ich da aber das problem nicht.
schliesslich wuerde sich da am code der klasse 'koloss' sich nix aendern, wenn er part aendern wuerde. oder was seh ich da nicht ?Meep Meep
-
das problem ist, dass der default copy-ctor zwar den vector von koloss - und somit die enthaltenen "part" objekte - korrekt kopiert, aber den "parent" pointer innerhalb der part objekte kopiert er flach, d.h. nur die adresse. somit zeigen alle parent pointer der kopie auf die ursprüngliche instanz von "koloss".
-
thordk schrieb:
das problem ist, dass der default copy-ctor zwar den vector von koloss - und somit die enthaltenen "part" objekte - korrekt kopiert, aber den "parent" pointer innerhalb der part objekte kopiert er flach, d.h. nur die adresse. somit zeigen alle parent pointer der kopie auf die ursprüngliche instanz von "koloss".
das war mir schon klar.
aber:CStoll schrieb:
aber die Klasse befindet sich noch in der Entwicklung - und ich müsste für jeden neuen Member drei Stellen anpassen, um ihn zu integrieren (machbar, aber imho fehleranfällig).
klingt fuer mich so, das er bei einem neuen member der klasse 'koloss' wieder nachbessern muesste. wenn er bei 'part' einen neuen member hinzufuegen wuerde, wuerde des std-ctor den neuen 'part' automatisch richtig kopieren.
vielleicht steh ich auch grad am schlauch.
CStoll, bitte erklaer das nochmal etwas genauerMeep Meep
-
habs so verstanden, dass er in koloss diverse objekte einfügen möchte, die nen verweis auf parent besitzen.
-
Klingt ein bißchen böse für mich, aber falls Du den Zuweisungsoperator nicht brauchst, könntest Du Dir das Default verhalten des op= zu nutze machen und danach Deinen Pointer setzten oder fantasiere ich hier gerade?
-
Meep Meep schrieb:
CStoll schrieb:
aber die Klasse befindet sich noch in der Entwicklung - und ich müsste für jeden neuen Member drei Stellen anpassen, um ihn zu integrieren (machbar, aber imho fehleranfällig).
klingt fuer mich so, das er bei einem neuen member der klasse 'koloss' wieder nachbessern muesste. wenn er bei 'part' einen neuen member hinzufuegen wuerde, wuerde des std-ctor den neuen 'part' automatisch richtig kopieren.
vielleicht steh ich auch grad am schlauch.Gut zusammengefasst - genau das war mein Kernproblem (*denkt über den Ansatz mit der Auslagerung nach*)
@templäd: Doch, ich brauche das Default-Verhalten, um alle übrigen Member der Koloss-Klasse zuzuweisen (und da sammelt sich leider einiges).
-
die aufteilung ist gut, allerdings würde ich eher den vector private vererben.
struct PartHelper { vector<part> m_parts; PartHelper(const PartHelper& help):m_parts(help.m_parts) { for(...)... } }; class Koloss:private PartHelper { //deine Hilfsvariablen //default copy ctor reicht ab hier };