继承的构造函数不工作|C++
Inherited Constructor not working | C++
我的基类位于Employee.h中,这是构造函数的代码。
Employee(string Fname = "First Name not Set.",
string Lname = "Last Name not Set.");
这是Employee.cpp 的代码
Employee :: Employee(string Fname = "First Name not Set.",
string Lname = "Last Name not Set.")
: FirstName(Fname), LastName(Lname)
{
}
问题出在我的构造函数上,它说它们的参数是错误的,但我不确定它们出了什么问题。
经理
class Manager: public Employee
public:
Manager(string Fname = "First Name not Set.",
string Lname = "Last Name not Set.", double sal = 0.0,
string BTitle = "Boss's Title not Set."): Employee (Fname,Lname){}
管理员.cpp
Manager :: Manager(string Fname = "First Name not Set.",
string Lname = "Last Name not Set.", double sal = 0.0,
string BTitle = "Boss's Title not Set."): Employee(Fname, Lname)
{
FirstName = Fname;
LastName = Lname;
salary = sal;
TitleOfBoss = BTitle;
}
这是我收到的错误消息:
'Manager::Manager' : redefinition of default parameter : parameter 4: : see declaration of 'Manager::Manager'
'Manager::Manager' : redefinition of default parameter : parameter 3: : see declaration of 'Manager::Manager'
'Manager::Manager' : redefinition of default parameter : parameter 2: : see declaration of 'Manager::Manager'
'Manager::Manager' : redefinition of default parameter : parameter 1: : see declaration of 'Manager::Manager'
Employee构造函数也是如此。
error C2572: 'Employee::Employee' : redefinition of default parameter : parameter 2: see declaration of 'Employee::Employee'
error C2572: 'Employee::Employee' : redefinition of default parameter : parameter 1: see declaration of 'Employee::Employee'
就像错误消息告诉您的那样,您已经多次定义了默认参数。在这两种情况下,默认值相同并不重要;它仍然是非法的。编译器错误的帮助页面非常清楚。
默认参数应该在类内声明构造函数的头文件中,或者应该在构造函数的实现中,但不能同时在两者中。
我建议您将它们留在头中,因为默认参数值是公共接口的一部分。然后构造函数的定义变成:
Manager::Manager( /* default values provided in header */
string Fname /* = "First Name not Set." */,
string Lname /* = "Last Name not Set." */,
double sal /* = 0.0 */,
string BTitle /* = "Boss's Title not Set." */)
: Employee(Fname, Lname)
, salary(sal), TitleOfBoss(BTitle)
{
}
编译器将忽略注释,它们只是用来提醒您声明提供了默认参数。
我还修复了使用初始化器列表初始化子对象的构造函数。这不是Java,构造函数内部很少有代码。
根据C++标准§8.3.6/4:
默认参数不应由以后的声明重新定义(而不是甚至达到相同的值)。
然而
对于非模板函数,可以稍后在中添加默认参数同一范围内函数的声明。
所以你可以写
Employee(string Fname = "First Name not Set.",
string Lname = "Last Name not Set.");
//...
Employee :: Employee(string Fname,
string Lname)
: FirstName(Fname), LastName(Lname)
{
}
或
Employee(string Fname,
string Lname);
//...
Employee :: Employee(string Fname = "First Name not Set.",
string Lname = "Last Name not Set.")
: FirstName(Fname), LastName(Lname)
{
}
或
Employee(string Fname,
string Lname = "Last Name not Set.");
//...
Employee :: Employee(string Fname = "First Name not Set.",
string Lname)
: FirstName(Fname), LastName(Lname)
{
}
您已经为标头和cpp中的每个参数定义了默认值(例如:string Fname = "First Name not Set."
)从cpp文件中删除它们以解决冲突,如下所示:
Manager :: Manager(string Fname, string Lname, double sal, string BTitle)
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 为什么stream::忽略未按预期工作