Ich habe eine lange Klasse mit vielen Mitgliedern. Ich möchte einen Kopierkonstruktor dafür schreiben. Aber wenn ich meinen eigenen Kopierkonstruktor schreibe, habe ich den Zugriff auf den Kopierkonstruktor verloren.
Ich möchte nur ein paar Zeiger in meinem eigenen Kopierkonstruktor reparieren. Daher möchte ich eine flache Kopie des Objekts haben, die standardmäßig mit dem Kopierkonstruktor erstellt werden kann.
Gibt es eine Möglichkeit, auf den Standard-Kopierkonstruktor zuzugreifen, wenn es bereits einen eigenen Kopierkonstruktor gibt?
Wickeln Sie die Dinge, die Sie nicht ändern wollen, in eine Struktur und leiten Sie (privat) daraus ab. Rufen Sie in Ihrem Kopierkonstruktor einfach den Kopierkonstruktor Ihrer Basisklasse auf.
Nein, Sie können nicht sowohl Standard als auch Ihre eigene Kopie haben.
Aber es gibt zwei Problemumgehungen mit diesem Problem:
1 Schließen Sie Ihre Zeiger in einer Klasse mit definierter Kopiensemantik ein
Beispiel:
%Vor%2 Schließen Sie die trivialen Parameter in einer trivialen Struktur ein
Beispiel:
%Vor%Ich würde immer die erste Lösung wählen.
[AKTUALISIEREN]
Es gibt auch eine dritte Lösung, die meiner zweiten sehr ähnlich ist: Sie schließen Ihren trivialen Teil in die private geerbte Basisklasse ein. Ich würde immer noch die erste Lösung bevorzugen.
Wickeln Sie die Dinge, die Sie nicht ändern wollen, in eine Struktur und leiten Sie (privat) daraus ab. Rufen Sie in Ihrem Kopierkonstruktor einfach den Kopierkonstruktor Ihrer Basisklasse auf.
Ich habe eine lange Klasse mit vielen Mitgliedern. Ich möchte einen Kopierkonstruktor dafür schreiben. Aber wenn ich meinen eigenen Kopierkonstruktor schreibe, habe ich den Zugriff auf den Kopierkonstruktor verloren.
Ich möchte nur ein paar Zeiger in meinem eigenen Kopierkonstruktor reparieren. Daher möchte ich eine flache Kopie des Objekts haben, die standardmäßig mit dem Kopierkonstruktor erstellt werden kann.
Gibt es eine Möglichkeit, auf den Standard-Kopierkonstruktor zuzugreifen, wenn es bereits einen eigenen Kopierkonstruktor gibt?
Nein, Sie können nicht sowohl Standard als auch Ihre eigene Kopie haben.
Aber es gibt zwei Problemumgehungen mit diesem Problem:
1 Schließen Sie Ihre Zeiger in einer Klasse mit definierter Kopiensemantik ein
Beispiel:
%Vor%2 Schließen Sie die trivialen Parameter in einer trivialen Struktur ein
Beispiel:
%Vor%Ich würde immer die erste Lösung wählen.
[AKTUALISIEREN]
Es gibt auch eine dritte Lösung, die meiner zweiten sehr ähnlich ist: Sie schließen Ihren trivialen Teil in die private geerbte Basisklasse ein. Ich würde immer noch die erste Lösung bevorzugen.
Der einfachste Weg wäre, die Zeiger in Klassen einzubinden, die die ' Reparatur manuell in ihrem Kopierkonstruktor ausführen, dann können Sie den Standard-Kopierkonstruktor verwenden.
>Nein, es gibt keine Möglichkeit, den Standardkopiekonstruktor von einem benutzerdefinierten Kopierkonstruktor aus aufzurufen.
Sie können entweder die Standardeinstellung oder Ihre eigene verwenden, nicht beide. Wenn Sie verschiedene Funktionen für verschiedene Objekte auswählen möchten, sollten Sie nur eine Memberfunktion schreiben, die diesen Fall behandelt.
%Vor%Zum Beispiel.
Sie können nicht auf die Standardkopie ctor zugreifen, wenn Sie Ihre eigene erstellt haben - der Compiler generiert sie nicht. Aber es gibt einen Workaround - teilen Sie Ihre Klasse in Datenstruktur und Logik.
Siehe Beispiel:
%Vor%Meine Lösung ist ein einfacher memcpy () anstelle des unmöglichen Aufrufs zum impliziten (compilergenerierten) Kopierkonstruktor, wie im folgenden Beispiel gezeigt:
%Vor%Der Nebeneffekt ist, dass memcpy () auch diesen nicht-trivialen Teil kopiert, was eine Verschwendung ist. Wenn der nicht-triviale Teil nicht zu viel Platz enthält, werde ich meine Lösung bevorzugen.
Zum Beispiel verschwendet eine Klasse wie unten nur 4 Byte Kopie des einen Zeigers, unter der Annahme, dass die Größe eines Zeigers 4 Bytes ist.
%Vor%Das hat bei mir funktioniert ... (C ++ 11, weiß nicht, ob es auf älteren std funktioniert) Nicht sicher, warum es nicht in einer Endlosschleife endet.
%Vor%Meine Lösung ist ein einfacher memcpy () anstelle des unmöglichen Aufrufs zum impliziten (compilergenerierten) Kopierkonstruktor, wie im folgenden Beispiel gezeigt:
%Vor%Der Nebeneffekt ist, dass memcpy () auch diesen nicht-trivialen Teil kopiert, was eine Verschwendung ist. Wenn der nicht-triviale Teil nicht zu viel Platz enthält, werde ich meine Lösung bevorzugen.
Zum Beispiel verschwendet eine Klasse wie unten nur 4 Byte Kopie des einen Zeigers, unter der Annahme, dass die Größe eines Zeigers 4 Bytes ist.
%Vor%Tags und Links c++ constructor deep-copy copy-constructor shallow-copy