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

C++ C++;复制派生类的构造函数,c++,class,copy-constructor,derived-class,C++,Class,Copy Constructor,Derived Class,这个类有三个父函数,换句话说,它是从其他三个类派生出来的 // copy constructor addressType(extPersonType &obj) { street = obj.street; city = obj.city; state = obj.state; zipcode = obj.zipcode; } // copy constructor personType(

这个类有三个父函数,换句话说,它是从其他三个类派生出来的

// 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;
    }
我正在尝试创建一个复制构造函数,这就是我所拥有的:

// Copy constructor
    extPersonType (extPersonType &obj) : addressType(obj), personType(obj), dataType(obj)
    {
        cout << "Copy constructor active." << endl;
        phone = obj.phone;
        ident = obj.ident;
    }
请记住,它们都有自己的头文件和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++。它将避免先调用默认构造函数,然后再调用赋值运算符

然而,使用派生来组合不相关的对象仍然是一个糟糕的设计。地址不符合与某人的IS-A关系因此让
extPersonType
addressType
派生没有多大意义

extPersonType
类将具有
addressType
成员时,应该使用包含

class extPersonType : public personType
{
    addressType address;
    dataType birth_date;
};
同时从这三门课中学习的唯一原因是懒惰。随着类的增长,最初节省的几秒钟将使代码更难维护。在某些情况下,您可能需要支持多个地址或日期,如招聘日期,如果在这种情况下,您将不得不对代码进行更多更改,因为变量将在许多地方使用。你将浪费你最初节省的所有时间,甚至更多

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


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

直接粘贴代码而不是图片,否则很难测试出来。你应该提供一个MVCE()为什么上面文本中的类名与简单代码不匹配<代码>构造函数与
地址类型
不同。这样的不一致表明你缺乏努力,也无助于为你的问题打分
personType(const extPersonType&obj)
不是复制构造函数。这是一个转换构造函数。我将在今天晚些时候粘贴代码。我发现你所有的评论都是贬义的,而不是有用的。我想我应该澄清一下,这是我第二年编写代码的时候了,作业中特别提到要同时从所有三个类派生extPersonType。所以我将无视你对“懒惰”的粗鲁评论和你关于使用遏制的想法。其次,我没有拼错“数据类型”,这是作业中的写法,只是为了澄清。正如我之前所说,这是我第二年的编码,我还在学习编码的基础知识,所以我将忽略你关于“阅读好书”的评论。至于你的其他评论,是的,我应该粘贴代码,但我很匆忙。我没有意识到我会因为给图片命名稍有不同而受到批评,而且没有一字不差。我只想知道如何正确地为一个派生自其他三个类的类创建一个复制构造函数,仅此而已。我希望你能重新评估你的语气,帮助我理解我的错误。@Tristan我怎么知道你还是个学生?在这种情况下,一个软件开发人员做出这样的妥协只是为了在短期内节省一些击键,这是完全不同的情况;我从来没有这样做过。考虑到我现在的立场,你能给我什么帮助吗?@Tristan如果你的老师明确告诉你在所谓的复制构造函数中有派生类型,那么第一个示例就是你编译错误的简单答案。否则,下一个示例就是实现它的方法,即定义真正的复制构造函数。我认为我的答案包含了你做家庭作业所需要的一切。然后,根据你的老师已经展示的内容,你可以采取任何适当的措施。