Мне не удалось найти хороший ответ на этот вопрос.
Я работаю над программой на C ++ и пытаюсь реализовать функцию с именем copy , котораяпринимает в качестве аргумента ссылку на другой объект.Затем он возвращает глубокую копию этого объекта.
Некоторые сведения о моем проекте: класс Scene содержит динамический массив (называемый «изображения») указателей либо на NULL, либо на экземпляркласса Image , который здесь не показан, но работает как следует (он наследует все свои методы от сторонней библиотеки, EasyBMP)
Причина, по которой я это делаючтобы избежать дублирования кода в двух местах, но вполне возможно, что я выбрал неправильный подход.
Я вызываю эту функцию в своем операторе присваивания:
Scene const & Scene::operator=(Scene const & source)
{
if (this != &source) {
clear();
copy(source);
}
return *this;
}
И мой конструктор копирования:
Scene::Scene(Scene const & source)
{
copy(source);
}
Наконец, мой метод copy () выглядит следующим образом:
Scene const & Scene::copy(Scene const & source)
{
Scene res(source.Max);
for (int i=0; i<res.Max; i++)
{
delete res.Images[i];
if (source.Images[i] != NULL)
res.Images[i] = new Image(*(source.Images[i]));
else
res.Images[i] = NULL;
}
return res;
}
В настоящее время он НЕ работает.Одна проблема, которую я вижу, состоит в том, что я пытаюсь вернуть переменную, которая выходит из области видимости, как только заканчивается функция копирования.Я пытался вернуть ссылку раньше, но компилятор выдавал ошибки, и это все равно не помогло бы с проблемой объема.
Но я даже не уверен, что моя логика верна, то есть вы можете даже сделать что-то вродеэто в конструкторе?Или я должен просто явно написать код в конструкторе копирования и операторе присваивания (без реализации вспомогательного метода copy )?
Я очень новичок в C ++ и указателях, поэтому любые рекомендациибудет высоко ценится.