Конструктор копирования C ++ для производного класса - PullRequest
0 голосов
/ 14 сентября 2018

Итак, у меня есть этот класс, который имеет три родительские функции, или, другими словами, он является производным от трех других классов.

Я пытаюсь создать конструктор копирования, и вот что у меня есть:

// Copy constructor
    extPersonType (extPersonType &obj) : addressType(obj), personType(obj), dataType(obj)
    {
        cout << "Copy constructor active." << endl;
        phone = obj.phone;
        ident = obj.ident;
    }

и вот мои конструкторы копирования для трех других классов.

// copy constructor
    addressType(extPersonType &obj)
    {
        street = obj.street;
        city = obj.city;
        state = obj.state;
        zipcode = obj.zipcode;
    }


// copy constructor
    personType(extPersonType &obj)
    {
        firstname = obj.firstname;
        lastname = obj.lastname;
    }


// copy constructor
    dataType(extPersonType &obj)
    {
        day = obj.day;
        month = obj.month;
        year = obj.year;
    }

Имейте в виду, что у каждого из них есть свои собственные заголовочные файлы и файлы cpp. Хотя в этом случае я использовал определение встроенной функции.

И все же вот ошибка, которую я получаю:

[traine@joker Assignment2]$ make
g++ ExtPerson.cpp -c
In file included from ExtPerson.h:5:0,
                 from ExtPerson.cpp:3:
Data.h:19:26: error: expected ‘)’ before ‘&’ token
   dataType(extPersonType &obj)
                      ^
In file included from ExtPerson.h:6:0,
                 from ExtPerson.cpp:3:
Person.h:18:28: error: expected ‘)’ before ‘&’ token
   personType(extPersonType &obj)
                        ^
In file included from ExtPerson.h:7:0,
                 from ExtPerson.cpp:3:
Address.h:20:29: error: expected ‘)’ before ‘&’ token
   addressType(extPersonType &obj)
                         ^
make: *** [ExtPerson.o] Error 1

Кто-нибудь знает, что я делаю не так? Я просто не понимаю, как создавать конструкторы копирования в производном классе и как вызывать другие конструкторы копирования в других классах. Любая помощь будет оценена, спасибо.

1 Ответ

0 голосов
/ 14 сентября 2018

Возможно, вам нужно добавить предварительное объявление, поскольку производный класс еще не объявлен при объявлении базового класса.

class extPersonType;

Но это не обязательно. Почему бы вам не объявить ваши базовые конструкторы по обычному шаблону? Это принимает аргумент того же типа, что и класс. Это прекрасно работает и не зависит от производного класса.

personType(const PersonType &obj) 
    : firstname(obj.firstname)
    , lastname(obj.lastname)
{
}

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

https://en.cppreference.com/w/cpp/language/initializer_list

Тем не менее, использование деривации для объединения несвязанных объектов все еще является плохим проектом Адрес не соответствует отношениям IS-A с человеком. Так что не имеет смысла иметь extPersonType производное от addressType.

Вместо этого вы должны использовать сдерживание, когда у вашего extPersonType класса будет addressType член.

class extPersonType : public personType
{
    addressType address;
    dataType birth_date;
};

Единственная причина, по которой можно получить 3 класса одновременно, - это лень . Несколько секунд, которые вы сначала сэкономите, сделают ваш код труднее поддерживать по мере роста вашего класса. И в какой-то момент вам может потребоваться поддержка более одного адреса или даты, например, даты приема на работу, если в этом случае вам придется внести гораздо больше изменений в код, так как переменная станет использоваться во многих местах. Вы будете тратить впустую все время, которое вы изначально сэкономили, и многое другое.

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

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

...