繁体   English   中英

派生类的 C++ 复制构造函数

[英]C++ Copy Constructor for a Derived Class

所以我有这个具有三个父函数的类,或者换句话说,它是从其他三个类派生的。

我正在尝试制作一个复制构造函数,这就是我所拥有的:

// 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

有谁知道我做错了什么? 我只是对如何在派生类中创建复制构造函数以及如何在其他类中调用其他复制构造函数感到困惑。 任何帮助将不胜感激,谢谢。

您可能需要添加前向声明,因为派生类在您声明基类时尚未声明。

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 个类派生的唯一原因是懒惰 随着类的增长,您最初将节省的几秒钟将使您的代码更难维护。 并且在某些时候,您可能需要支持多个地址或日期,例如招聘日期,如果在这种情况下,随着变量在许多地方使用,您将不得不对代码进行更多更改。 您将浪费最初节省的所有时间以及更多。

顺便说一句,在代码中拼错单词是个坏主意。 正确的拼写是日期而不是数据,因为我们可以很容易地看出它是来自成员的日期而不是任意数据。

顺便说一句,阅读有关设计和编码的好书可能是个好主意,因为这是每个程序员都应该掌握的非常基本的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM