派生的 C++ 复制构造函数 Class
C++ Copy Constructor for a Derived Class
所以我有这个 class 具有三个父函数,或者换句话说,它派生自其他三个 classes.
我正在尝试创建一个复制构造函数,这就是我所拥有的:
// Copy constructor
extPersonType (extPersonType &obj) : addressType(obj), personType(obj), dataType(obj)
{
cout << "Copy constructor active." << endl;
phone = obj.phone;
ident = obj.ident;
}
这是我为其他三个 class 编写的复制构造函数。
// 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 中创建复制构造函数以及如何在其他 class 中调用其他复制构造函数感到困惑。如有任何帮助,我们将不胜感激。
您可能需要添加前向声明,因为派生 class 在您声明基础 class 时尚未声明。
class extPersonType;
但这不是必须的。你为什么不按照正常模式声明你的基本构造函数?即接受与 class 相同类型的参数。那可以正常工作,并且不依赖于派生的 class.
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
class 有一个 addressType
成员时,您应该使用遏制。
class extPersonType : public personType
{
addressType address;
dataType birth_date;
};
一次从 3 个 class 派生的唯一原因是 懒惰 。随着 class 的增长,您最初节省的几秒钟将使您的代码更难维护。在某些时候,您可能需要支持多个地址或日期,例如雇用日期,如果在这种情况下,您将不得不对代码进行更多更改,因为变量会在许多地方使用。您将浪费您最初节省的所有时间以及更多。
顺便说一下,在代码中拼错单词可不是个好主意。正确的拼写是 date 而不是 data 因为我们可以很容易地看出它是来自成员的日期而不是任意数据。
顺便说一句,阅读有关设计和编码的好书可能是个好主意,因为这是每个程序员都应该掌握的非常基础的东西。
所以我有这个 class 具有三个父函数,或者换句话说,它派生自其他三个 classes.
我正在尝试创建一个复制构造函数,这就是我所拥有的:
// Copy constructor
extPersonType (extPersonType &obj) : addressType(obj), personType(obj), dataType(obj)
{
cout << "Copy constructor active." << endl;
phone = obj.phone;
ident = obj.ident;
}
这是我为其他三个 class 编写的复制构造函数。
// 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 中创建复制构造函数以及如何在其他 class 中调用其他复制构造函数感到困惑。如有任何帮助,我们将不胜感激。
您可能需要添加前向声明,因为派生 class 在您声明基础 class 时尚未声明。
class extPersonType;
但这不是必须的。你为什么不按照正常模式声明你的基本构造函数?即接受与 class 相同类型的参数。那可以正常工作,并且不依赖于派生的 class.
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
class 有一个 addressType
成员时,您应该使用遏制。
class extPersonType : public personType
{
addressType address;
dataType birth_date;
};
一次从 3 个 class 派生的唯一原因是 懒惰 。随着 class 的增长,您最初节省的几秒钟将使您的代码更难维护。在某些时候,您可能需要支持多个地址或日期,例如雇用日期,如果在这种情况下,您将不得不对代码进行更多更改,因为变量会在许多地方使用。您将浪费您最初节省的所有时间以及更多。
顺便说一下,在代码中拼错单词可不是个好主意。正确的拼写是 date 而不是 data 因为我们可以很容易地看出它是来自成员的日期而不是任意数据。
顺便说一句,阅读有关设计和编码的好书可能是个好主意,因为这是每个程序员都应该掌握的非常基础的东西。