我的基类位于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)
{
}问题出在我的两个构造函数上,它说它们的参数是错误的,但我不确定它们出了什么问题。
Manager.h
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){}Manager.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'发布于 2014-10-14 11:50:58
就像错误消息告诉您的那样,您已经多次定义了默认参数。缺省值在两种情况下都是相同的,这并不重要;它仍然是非法的。The help page for that compiler error非常清楚。
默认参数应该在声明构造函数的类内部的头文件中,或者它们应该在构造函数的实现中,但不能同时存在。
我建议您将它们留在头中,因为默认参数值是公共接口的一部分。然后构造函数定义变成:
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,在构造函数体中很少有代码。
发布于 2014-10-14 11:55:30
根据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)
{
}发布于 2014-10-14 11:53:43
您已经为头文件和cpp中的每个参数定义了默认值(例如:string Fname = "First Name not Set."),将它们从cpp文件中删除以解决冲突,如下所示:
Manager :: Manager(string Fname, string Lname, double sal, string BTitle)https://stackoverflow.com/questions/26352319
复制相似问题