В c++, когда классы содержат динамически выделяемые данные, обычно разумно явно определить конструктор копирования, оператор = и деструктор. Но действие этих специальных методов пересекается. Точнее, оператор = обычно сначала выполняет некоторое разрушение, а затем копирует, аналогично тому, как это делается в конструкторе копирования.
Мой вопрос заключается в том, как лучше всего написать это, не повторяя те же строки кода и без необходимости выполнения процессором ненужной работы (например, ненужного копирования).
Обычно я использую два вспомогательных метода. Один для строительства, другой для разрушения. Первый вызывается как из конструктора копирования, так и из оператора =. Второй используется деструктором и оператором=.
Вот пример кода:
Код: Выделить всё
template
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();
}
};
И хорошая ли привычка разбивать код таким образом?
Источник: https://stackoverflow.com/questions/175 ... d-operator
Мобильная версия