2012-03-23 4 views
1

Ich habe noch nie einen Kopierkonstruktor geschrieben, also wollte ich, um Schmerzen zu vermeiden, wissen, ob das, was ich kodiert habe, echt ist. Es kompiliert, aber ich bin mir nicht sicher, ob es als Kopierkonstruktor funktioniert.C++ Verwenden von const in einem Kopierkonstruktor?

Auch muss ich const im Kopierkonstruktor verwenden, oder ich kann es einfach fallen lassen. (Was ich an const nicht mag, ist, dass der Compiler schreit, wenn ich einige nicht konstante Funktionen verwende).

//EditNode.h 
class EditNode 
{ 
     explicit EditNode(QString elementName); 
     EditNode(const EditNode &src); 
} 

//EditNodeContainer.h 
class EditNodeContainer : public EditNode 
{ 
     explicit EditNodeContainer(QString elementName); 
     EditNodeContainer(const EditNodeContainer &src); 
} 

//EditNodeContainer.cpp 
EditNodeContainer::EditNodeContainer(QString elementName):EditNode(elementName) 
{ 
}  

//This seems to compile but not sure if it works 
EditNodeContainer::EditNodeContainer(const EditNodeContainer &src):EditNode(src) 
{ 

} 


//the idea whould be to do something like this 
EditNodeContainer *container1 = new EditNodeContainer("c1"); 
EditNodeContainer *copyContainer = new EditNodeContainer(container1); 
+0

Ihr Kopierkonstruktor tut nichts, was der vom Compiler erzeugte nicht tut. –

+0

Gibt es einen Grund, warum Sie einen benutzerdefinierten Kopierkonstruktor schreiben müssen? In vielen Fällen sollte die Standardeinstellung gut sein. – Philipp

+0

, d. H., Wenn Sie Daten von einem Mitglied und nicht den Zeiger selbst kopieren möchten – kappa

Antwort

3

A Copykonstruktor ist ein Konstruktor, der eine der folgenden Signaturen aufweist:

class A 
{ 
    A(A& other); 
    //or 
    A(const A& other); 
    //or 
    A(volatile A& other); 
    //or 
    A(const volatile A& other); 
    //or any of the above + other parameters that have default arguments 
    //example: 
    A(const A& other, int x = 0) //this is also a copy constructor 
}; 

Das oben angegeben in 12.8.2 des Standards - C++ 03. Sie implementieren also korrekt einen Kopierkonstruktor.

Der Grund, dass es einen const Parameter erhalten sollte, ist, dass Sie das Objekt nicht ändern, von dem Sie kopieren. Wenn Sie nichtkonstante Funktionen aufrufen, tun Sie etwas falsch.

Auch in Ihrem Snippet

EditNodeContainer *container1 = new EditNodeContainer("c1"); 
EditNodeContainer *copyContainer = new EditNodeContainer(container1); 

Sie nicht eine Kopie Konstruktor aufrufen, weil Sie einen EditNodeContainer* als Parameter vorbei sind, kein EditNodeContainer.

1

Sie vermissen ein * Symbol. Der Kopierkonstruktor erwartet den Verweis auf das Objekt, erhält jedoch den Zeiger auf das Objekt. Ersetzen Sie einfach container1 durch *container1 als Parameter des Kopierkonstruktors.

+0

Sie haben Recht, da Container1 ist ein Zeiger, so dass er es Referenzieren muss – kappa

0

Der Parameter eines Kopierkonstruktors kann eine lvalue-Referenz auf non-const oder eine lvalue-Referenz auf const sein, aber in der Praxis ist es immer eine Referenz auf const (die veraltete auto_ptr ist eine Ausnahme).

Sie sollten keinen Kopierkonstruktor schreiben, es sei denn, Sie müssen und Sie verstehen die Konsequenzen vollständig. Wenn Sie RAII-Klassen überall konsequent verwenden, benötigen Sie selten einen benutzerdefinierten Kopierkonstruktor (es sei denn, Sie schreiben eine RAII-Klasse).

Vermeiden Sie auch, wenn möglich, rohe Zeiger und new.