2014-10-11 2 views
1

Это конструктор узла в классе списка. Мне нужно сделать глубокую копию винзавода, другого класса в списке инициализации. Элемент - это экземпляр винзавода.Как сделать глубокую копию в списке инициализации конструкторов. C++

List::Node::Node(const Winery& winery) : 
    item(winery) 
    // your initialization list here 
{ 
    Winery w = winery; 
    item = w; 
} 

конструктор винодельни:

Winery::Winery(const char * const name, const char * const location, 
     const int acres, const int rating) : 
    name(name), 
    location(location), 
    acres(acres), 
    rating(rating) 
{ 
    char *nm = new char[strlen(name) + 1]; 
    char *loc = new char[strlen(location) + 1]; 
    strcpy(nm, this->name); 
    strcpy(loc, this->location); 
    this->name = nm; 
    this->location = loc; 
    this->acres = acres; 
    this->rating = rating; 
} 
+1

Сделайте ctor для 'winery', который делает глубокую копию. BTW: ctor-init-list и ctor-body выглядят так, как будто они дублируют друг друга. – Deduplicator

+0

Вы правы, я возьму это. Я добавил код, который у меня есть для конструктора winery. –

+0

«глубокая копия» и «мелкая копия» - это термины, которые обычно используются только в языках GC, которые не имеют прямой поддержки значений (в отличие от только указателей). – o11c

ответ

2

Там совершенно нет Резон скопировать винодельни три раза в узле CTOR.
После достаточно:

List::Node::Node(const Winery& winery) : item(winery) {} 

Вы можете добавить вселения CTOR хотя (C++ 11 и выше):

List::Node::Node(Winery&& winery) : item(std::move(winery)) {} 

Похожие на Winery.
Если эти четыре являются членами, то Winery -ctor уже выполняет глубокую копию.

Надеюсь, вы запомнили правило-3, а также предоставили собственный экземпляр-ctor, copy-assign-operator и dtor.
Тем не менее, лучше использовать std::unique_ptr или std::string.

Кроме того, cv-квалификаторы верхнего уровня бесполезны, поэтому я удалил их.

Winery::Winery(const char * name, const char * location, 
     int acres, int rating) : 
    name(strcpy(new char[strlen(name)+1], name), 
    location(strcpy(new char[strlen(location)+1], location), 
    acres(acres), 
    rating(rating) 
{} 
Смежные вопросы