In C++ quando le classi contengono dati allocati dinamicamente è generalmente ragionevole definire il costruttore di copie, operator = e destructor. Ma l'attività di questi metodi speciali si sovrappone. Più specificatamente operator = di solito prima fa qualche distruzione e poi fa coping simile a quello in copy constructor.Evitare di ripetere lo stesso codice in copy constructor e operator =
La mia domanda è come scrivere questo nel modo migliore senza ripetere le stesse linee di codice e senza la necessità che il processore svolga il lavoro non necessario (come la copia non necessaria).
Di solito finisco con due metodi di aiuto. Uno per la costruzione e uno per la distruzione. Il primo è chiamato da copy constructor e operator =. Il secondo è usato da destructor e operator =.
Ecco il codice di esempio:
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();
}
};
Questo è anche corretto? Ed è una buona abitudine dividere il codice in questo modo?
+1 perché la domanda ha contribuito a sensibilizzare. Sembra qualcosa che avrei scritto prima di leggere le risposte. – ToolmakerSteve
Hm, raramente ho duplicato il codice in entrambi, dal momento che entrambi fanno cose completamente diverse: uno inizializza, uno assegna ... – PlasmaHH
è la natura della "copia profonda" del suo design di classe che porta alla duplicazione. – ToolmakerSteve