Dev C++编译C++工资单程序报taxRate私有及HourlyEmp构造函数匹配错误求助
问题分析与修复方案
报错1:[Error] 'double Employee::taxRate' is private
原因
taxRate是Employee基类的private私有成员,类外包括派生类都没有直接访问权限,你在三个派生类SalariedEmp/HourlyEmp/CommEmp的calcSalary方法中直接调用该私有成员,触发了权限校验报错。
解决方案(二选一即可)
- 方案1(更符合封装规范):在
Employee基类的public区域新增税率获取方法,派生类调用该方法取值:
// 在Employee类的public块添加 double getTaxRate() const { return taxRate; } // 之后所有派生类calcSalary里的taxRate替换为getTaxRate()即可
- 方案2:把
Employee类中taxRate的访问权限从private改为protected,protected成员允许派生类直接访问:
class Employee { private: string name; protected: // 移到protected块 double taxRate; // 其余代码不变 };
报错2:[Error] no matching function for call to 'HourlyEmp::HourlyEmp(const char [8], double, int, int)'
原因
你所有子类和基类的构造函数第一个参数都是string&非const左值引用,而你实例化时传入的是字符串字面量(如"Faakhir"),它转换出的std::string是临时对象,C++不允许临时对象绑定到非const左值引用,因此找不到匹配的构造函数。
解决方案
把所有构造函数的第一个参数类型改为const string&,const左值引用支持绑定临时对象:
// 举例修改构造函数声明,其余子类构造函数、构造函数实现的参数都同步修改即可 Employee(const string&, double); SalariedEmp(const string&,double,double); HourlyEmp(const string&,double,int,double); CommEmp(const string&, double, double, double);
其他隐藏问题修复
generatePayroll函数在main函数调用前没有声明,需要在main之前加函数前置声明:
void generatePayroll(Employee* emp[], int size);
emp数组共10个元素,你只初始化了前3个,剩下7个是空指针,遍历会触发崩溃,可以把遍历逻辑改为只处理非空指针,或者缩小数组长度为3。
内容的提问来源于stack exchange,提问作者azhar
相关产品推荐
相关产品推荐

