Ich habe kürzlich entdeckt, dass, wenn ich Zeiger innerhalb einer Klasse habe, ich einen Copy-Konstruktor angeben muss.Kopieren Konstruktor mit Zeigern
Um das zu lernen, habe ich den folgenden einfachen Code gemacht. Es kompiliert, aber gibt mir Laufzeitfehler beim Ausführen des Kopierkonstruktors.
Ich versuche, nur den Wert aus dem Zeiger des kopierten Objekts zu kopieren, aber die gleiche Adresse zu vermeiden.
Also, was ist hier falsch?
class TRY{
public:
TRY();
~TRY();
TRY(TRY const &);
int *pointer;
void setPointer(int);
};
void TRY::setPointer(int a){
*pointer = a;
return;
}
TRY::TRY(){}
TRY::~TRY(){}
TRY::TRY(TRY const & copyTRY){
int a = *copyTRY.pointer;
*pointer = a;
}
int main(){
TRY a;
a.setPointer(5);
TRY b = a;
b.setPointer(8);
cout << "Address of object a = " << &a << endl;
cout << "Address of object b = " << &b << endl;
cout << "Address of a.pointer = " << a.pointer << endl;
cout << "Address of b.pointer = " << b.pointer << endl;
cout << "Value in a.pointer = " << *a.pointer << endl;
cout << "Value in b.pointer = " << *b.pointer << endl;
return 0;
}
Ich werde dieses Konzept für andere Klassen mit vielen Zeiger in es verwenden, wo ich auf Objekt zum anderen alle Werte kopieren müssen. Das Kopieren ist für diesen Code zunächst notwendig, daher möchte ich die Kopiermöglichkeit behalten (ich werde den Kopierkonstruktor nicht als privat verstecken).
Außerdem muss die reale Klasse, die ich implementieren muss, 10 Zeiger haben, und es könnte sich mit der Zeit ändern. Ist das nicht eine etwas intelligentere Weise einen tiefen Copykonstruktor in C++ haben? ...
Vergessen Sie nicht, m_p zu löschen, bevor Sie ein neues Objekt zuweisen. – xtofl
Ich habe den Zuweisungsoperator nicht definiert, es ist nur ein Kopierkonstruktor. Daher muss m_p nicht gelöscht werden. – Naveen
In einem Konstruktor wird m_p anfangs undefiniert sein, es sei denn, Sie fügen es explizit in die Initialisierungsliste ein. Wenn Sie versuchen, einen nicht definierten Zeiger zu löschen, werden schlimme Dinge passieren. –