Komplexe Strukturen kopieren



  • Hallo,
    ich habe eine recht komplexe Struktur gebaut (unten ist nur ein Ausschnitt daraus), u.a. mit DynamicArrays. Nun möchte ich zur Laufzeit eine Kopie dieser Struktur anlegen. Wie mache ich das. So ist ja ein Kopieroperator nicht implementiert. Muss ich jedes einzelne Element in Schleifen rüberkopieren? Dies ist natürlich fehlerträchtig, wenn ich mal ein Element hinzufüge und vergesse die Kopierroutine anzupassen...

    Beispiel

    struct MyStruc{
          BYTE Id;
          DynamicArray <struct Data{
             BYTE PinId;
             BYTE PinNummer;         
             DynamicArray <BYTE> Prop;
             DynamicArray <BYTE> Para;
             BYTE FctId;                      
          }> Pin;
       };
    
       struct MyStruct2 {
          AnsiString Name;
          bool Checked;  // Ob Funktion in der Oberfläche ausgewählt ist
          bool Locked;   // Möglichkeit die Funktion von aussen her zu 
          DynamicArray <struct MyStruc> PossibleConnectors;
       };
    


  • Du mußt halt für jede deiner structs einen Kopykonstruktor implementieren. DynamicArray hat ja auch eine Membervariable Length, so dass du da eigentlich auch nichts falsch machen kannst.
    Ich würde statt DynamicArray lieber vector verwenden.



  • Danke für die Antwort, aber noch ne Dumme Frage. Wie implementiere ich einen Copykontruktor?



  • Hallo

    für Grundlagen des OOP siehe hier.

    bis bald
    akari



  • Hier mal ein Beispiel für dein MyStruct

    struct MyStruc{
       BYTE Id;
       struct Data
       {
          BYTE PinId;
          BYTE PinNummer;
          DynamicArray <BYTE> Prop;
          DynamicArray <BYTE> Para;
          BYTE FctId;
          Data(const Data& src) : PinId(src.PinId), PinNummer(src.PinNummer), FctId(src.FctId)
          {
            Prop = src.Prop.Copy();
            Para = src.Para.Copy();
          }
       };
       DynamicArray <Data> Pin;
       MyStruc(const MyStruc& src) : Id(src.Id), Pin(src.Pin.Copy()) { }
    };
    

    Prop und Para könnte man eigentlich auch noch in die Initialisierungsliste packen. evtl. braucht man hier noch den Zuweisungsoperator.



  • Ok, hat geklappt. Allerdings schaffe ich das kopieren jetzt nur beim Anlegen der Struktur.

    MyStruct Test();
    
    ....
    
    MyStruct Test2(Test);
    

    Zur Laufzeit geht das nicht, oder? Muss ich dann lieber ne Klasse nehmen? ICh brauche es , da in einem Hauptteil Daten in der Struktur stehen und i einem zweiten Teil Änderungen vorgenommern werden an der zweiten Struktur, die ggf. verworfen werden. Wenn nicht, dann müssen sie wieder in die erste Struktur rein.



  • Hallo

    Der effiziente Weg ist, das du das was du nun in deinem Kopierkonstruktor stehen hast, in eine extra Funktion namens z.b. Assign() auszulagerst, die du dann vom Konstruktor aus aufrufst. Wenn du jetzt noch den Zuweisungsoperator = für dein struct überschreibst und diesen ebenfalls Assign aufrufen läßt, bist du für alle Übernahme-Fälle gerüstet.

    struct und class sind fast äquivalent. Nur der Standard-Zugriffsbeschränkungen ist unterschiedlich (class = private, struct = public). Deshalb bringt ein Umbau nichts weiter.

    bis bald
    akari



  • Hallo,

    Man könnte der struct auch eine swap-Funktion zum Austausch der Member geben. Dann kann man wieder all diese Funktionen über den Kopierkonstruktor erschlagen.


Anmelden zum Antworten