Избегайте повторения одного и того же кода в конструкторе копирования и операторе=.C++

Программы на C++. Форум разработчиков
Ответить
Гость
 Избегайте повторения одного и того же кода в конструкторе копирования и операторе=.

Сообщение Гость »


В 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»