Wie wird in C ++ sowohl der Standardkonstruktor als auch der Konstruktor für eigene Kopien verwendet?

8

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?

    
pablo 14.09.2012, 10:52
quelle

8 Antworten

11

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.

    
James Kanze 14.09.2012, 10:57
quelle
6

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.

    
PiotrNycz 14.09.2012 10:57
quelle
3
___ answer12423125 ___

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.

    
___ qstntxt ___

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?

    
___ answer12423126 ___

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.

    
___ answer12423148 ​​___

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.

>     
___ answer12423105 ___

Nein, es gibt keine Möglichkeit, den Standardkopiekonstruktor von einem benutzerdefinierten Kopierkonstruktor aus aufzurufen.

    
___ answer12423171 ___

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.

    
___ answer12423313 ___

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%     
___ answer26461017 ___

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%     
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ answer40503778 ___

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%     
___ tag123constructor ___ Eine spezielle Art von Subroutine, die bei der Erstellung eines Objekts aufgerufen wird. ___ tag123shallowcopy ___ flache Kopie enthält eine Verknüpfung (Adresse im Speicher) mit der ursprünglichen Variablen. Änderungen an flachen Kopien spiegeln sich im Ursprungsobjekt wider. ___ tag123copyconstructor ___ Ein Kopierkonstruktor ist ein Konstruktor, der ein neues Objekt erstellt, das ein Klon eines vorhandenen Objekts ist. Der Begriff wird meist in der Programmiersprache C ++ verwendet, wobei Kopierkonstruktoren einen besonderen Status haben. ___ tag123deepcopy ___ Eine tiefe Kopie dupliziert das Objekt oder die Variable, auf die verwiesen wird, so dass das Ziel (das Objekt, dem es zugewiesen wurde) eine eigene lokale Kopie erhält. Verwenden Sie dieses Tag für Fragen zum Implementieren oder Verwenden von Tiefkopie-Methoden. ___ qstnhdr ___ Wie wird in C ++ sowohl der Standardkonstruktor als auch der Konstruktor für eigene Kopien verwendet? ___
Keldon Alleyne 14.09.2012 10:58
quelle
0

Nein, es gibt keine Möglichkeit, den Standardkopiekonstruktor von einem benutzerdefinierten Kopierkonstruktor aus aufzurufen.

    
ronag 14.09.2012 10:56
quelle
0

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.

    
Aesthete 14.09.2012 11:00
quelle
0

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%     
Rost 14.09.2012 11:09
quelle
0

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%     
Robin Hsu 20.10.2014 08:06
quelle
0

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%     
chhu79 09.11.2016 09:39
quelle