In C++, wenn Klassen dynamisch zugeordnete Daten enthalten, ist es normalerweise sinnvoll, explizit den Kopierkonstruktor operator = und destructor zu definieren. Aber die Aktivität dieser speziellen Methoden überlappt sich. Genauer gesagt, operator = normalerweise zuerst etwas Zerstörung und dann macht es Coping ähnlich dem im Copy-Konstruktor.Vermeiden Sie, den gleichen Code im Kopierkonstruktor zu wiederholen und operator =
Meine Frage ist, wie man dies am besten schreibt, ohne die gleichen Codezeilen zu wiederholen und ohne dass der Prozessor unnötige Arbeit verrichten muss (wie unnötiges Kopieren).
Ich habe normalerweise zwei helfende Methoden. Eine für den Bau und eine für die Zerstörung. Die erste wird sowohl von copy constructor als auch operator = aufgerufen. Die zweite wird von destructor und operator = verwendet. Hier
ist der Beispielcode:
template <class T>
class MyClass
{
private:
// Data members
int count;
T* data; // Some of them are dynamicly allocated
void construct(const MyClass& myClass)
{
// Code which does deep copy
this->count = myClass.count;
data = new T[count];
try
{
for (int i = 0; i < count; i++)
data[i] = myClass.data[i];
}
catch (...)
{
delete[] data;
throw;
}
}
void destruct()
{
// Dealocate all dynamicly allocated data members
delete[] data;
}
public: MyClass(int count) : count(count)
{
data = new T[count];
}
MyClass(const MyClass& myClass)
{
construct(myClass);
}
MyClass& operator = (const MyClass& myClass)
{
if (this != &myClass)
{
destruct();
construct(myClass);
}
return *this;
}
~MyClass()
{
destruct();
}
};
Ist das auch richtig? Und ist es eine gute Angewohnheit, den Code auf diese Weise zu teilen?
+1, weil die Frage half, mein Bewusstsein zu erhöhen. Es sieht so aus, als hätte ich etwas geschrieben, bevor ich die Antworten gelesen habe. – ToolmakerSteve
Hm, ich habe Code in beiden selten dupliziert, da sie beide ganz verschiedene Dinge tun: man initialisiert, man ordnet ... – PlasmaHH
es ist die "tiefe Kopie" Natur seines Klassenentwurfs, der zur Vervielfältigung führt. – ToolmakerSteve