2012-05-20 6 views
3

Я создал этот конструктор, и мне нужно сделать глубокую копию. Я не совсем понимаю смысл глубокой копии. Я знаю, что он делает независимую копию объекта, у которого есть своя динамическая память, но я не понимаю, что нужно для этого. Я также не уверен, как реализовать глубокую копию. Какие-либо предложения?Как сделать глубокую копию этого конструктора?

Вот мой конструктор, который мне нужен, чтобы сделать глубокую копию: Может ли кто-нибудь предоставить некоторую синтаксическую помощь, например, скелет?

template<class t_type> 
inline ALIST<t_type>::ALIST() 
{ 
    t_type value; 
    capacity=10; 
    DB = new t_type[capacity]; 
    count=capacity; 

    cout<<"Enter value: "; 
    cin.clear(); 
    cin>>value; 


    for(int i=0; i<capacity; i++) 
    { 
    DB[i]=value; 
    } 
} 
+3

Сделайте 'DB'' 'std :: vector ', и вы получите глубокую копию бесплатно. Но выполнение консольного ввода-вывода внутри конструктора действительно * действительно * ДЕЙСТВИТЕЛЬНО сомнительно для начала. –

+2

Эх, это домашнее задание. Если бы я когда-либо видел это в коммерческом C++, я бы начал кричать. – pg1989

+0

Может ли кто-нибудь предоставить некоторую синтаксическую помощь, например, скелет? – Mike

ответ

4

What is the copy-and-swap idiom?

Глубокие копии используются, так что вы можете скопировать всю информацию о том, что объект имеет, а затем изменить копию, не изменяя оригинал. В широком смысле мелкая копия копирует только сам указатель, но все же указывает на ту же информацию. Это может привести к неожиданным изменениям данных, если вы не будете осторожны.

+3

Не говоря уже о двойном удалении. –

+0

Абсолютно. Попытка удалить что-то, что не существует, никогда не заканчивается хорошо и приводит к труднодоступным ошибкам. – 3Pi

3

Пройдите через presentation слайды Страуструпа # 14 и # 15, в частности,

Deep копия: скопировать указатель, а также то, что он указует, так что два указателей теперь каждые сослаться на отдельный объект

  • Какой вектор, строка и т.д. сделать
  • Требуется конструкторы копирования и копирования заданий для контейнерных классов

В принципе, что это сводится к тому, заключается в следующем: управлять указатели правильно, эффективно и безопасно. Вероятно, вы также захотите посмотреть на статьи copy-and-swap и SOTTER GOTW на Exception-safe class design, Exception Safety и Exception Safe Function calls.

1

Пример может быть задан из игр. Предположим, у вас есть стратегическая игра, у вражеских солдат есть индивидуальные атрибуты, такие как броня, здоровье и т. Д. Предположим, что игра читает эти атрибуты из текстового файла и присваивает атрибуты каждый раз, когда создается солдат-враг. Вместо того, чтобы снова и снова считывать всю информацию из текстового файла или хранить текстовый файл в памяти, который обычно больше, чем его объектная форма, имея пул объектов-прототипов, которые создаются на этапе загрузки из того же текстового файла , может быть лучшим решением. Когда необходим солдат-враг, вы можете создать его из объекта-прототипа, передав его конструктору нового объекта или по образцу фабрики. В конструкторе (или на фабричном классе) вам наверняка понадобится глубокая копия и будьте осторожны, создайте все объекты вместо назначения указателей на наличие отдельных объектов.

Смежные вопросы