В C++, когда классы содержат динамически распределенные данные, обычно разумно явно определять конструктор копирования, operator = и destructor. Но деятельность этих специальных методов перекрывается. Более конкретно оператор = обычно сначала выполняет некоторую разрушение, а затем справляется с аналогичной задачей в конструкторе копирования.Избегайте повторения одного и того же кода в конструкторе копирования и операторе =
Мой вопрос заключается в том, как написать это наилучшим образом, не повторяя одни и те же строки кода и не требуя, чтобы процессор выполнял ненужную работу (например, ненужное копирование).
Обычно я получаю два метода помощи. Один для строительства и один для уничтожения. Первый вызван как из конструктора копирования, так и для оператора =. Второй используется деструктором и оператором =.
Вот пример кода:
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();
}
};
Является ли это даже правильно? И это хорошая привычка разбивать код таким образом?
+1 потому что вопрос помог поднять мое осознание. Это похоже на то, что я написал бы, прежде чем читать ответы. – ToolmakerSteve
Хм, у меня редко есть дублированный код в обоих случаях, так как они оба делают совершенно разные вещи: один intializes, один присваивает .... – PlasmaHH
его «глубокая копия» характера его класса, который приводит к дублированию. – ToolmakerSteve