Что ваш (внутренний) код делает на английском языке:
//allocate new memory and copy
images = new Image*[source.maximum];
Устанавливает images
для вновь распределенного массива source.maximum
неинициализированных Image
указателей. Все, на что указывал images
, потеряно.
Scene(source);
Это создает новый временный Scene
объект и затем выбрасывает его. он не «повторно вызывает» конструктор на this
.
//deallocate old memory
delete *source;
Это, если бы это работало, разыменовало бы source
(что является const Scene&
, так что это работает, только если определено T* Scene::operator *(void)
, где T
- некоторый тип) и удаляло бы указанный T
объект. * * тысяча двадцать-один
//assign
source=images;
Попытка скопировать images
поверх source
, что не должно происходить, поскольку source
равно const
. После создания ссылка не может быть изменена для ссылки на другой объект.
this->maximum=images.maximum;
Это не работает. images
- это Image**
, в котором нет поля maximum
. Кроме того, this->
является избыточным.
ОБНОВЛЕНИЕ: Относительно новой версии:
Во-первых, вам не нужно говорить this->
везде.
for (int i=0;i<source.maximum;i++)
this->images[i]=source->images[i];
Проблема здесь в том, что source
является ссылкой, а не указателем, поэтому вы должны использовать source.images[i]
вместо source->images[i]
.
Предполагая, что это исправлено, теперь проблема в том, что на объекты изображения указывают как текущий объект, так и source
. Если какой-либо объект освобождает память (delete images[i]; images[i] = 0;
или аналогичный), указатель на другой объект становится недействительным Если изображения никогда не удаляются, , тогда этот код подходит.
Если, однако, вы хотите, чтобы этот объект имел свои собственные копии изображений, вам нужно проделать дополнительную работу:
if(this != &source)
{
// Delete old images.
for(int i = 0; i < maximum; i++)
delete images[i];
delete[] images;
// Copy new images.
maximum = source.maximum;
images = new Image*[maximum];
for(int i = 0; i < maximum; i++)
images[i] = new Image(*(source.images[i]));
}
Предполагается, что у вас есть конструктор копирования для Image
(Image::Image(const Image&);
).
Наконец, Scene
должен иметь конструктор копирования, который работает аналогично этому, за исключением того, что ему не нужно удалять старые вещи. Если вы не делаете копии изображений, используйте:
Scene::Scene(const Scene& original): maximum(original.maximum)
{
images = new Image*[maximum];
for(size_t i = 0; i < maximum; i++)
images[i] = source.images[i];
}
Если вы делаете копируете изображения, используйте:
Scene::Scene(const Scene& original): maximum(original.maximum)
{
images = new Image*[maximum];
for(size_t i = 0; i < maximum; i++)
images[i] = new Image(*(source.images[i]));
}
В обоих случаях не забудьте добавить Scene(const Scene& original);
к определению класса.