C++继承类Papersworker调用GetSalary方法cout无法输出薪资求助
问题原因及修复方案
直接导致无输出的原因
程序运行后会先执行std::cin >> sr;等待控制台输入数值,此时程序处于阻塞状态,没有后续输出属于正常情况,输入合法数字后按下回车,即可看到对应的薪资计算结果。
如果输入后依然没有输出,可在最后一行cout后添加<< std::endl;或者<< std::flush;强制刷新输出缓冲区即可。
代码核心逻辑问题
1. 派生类重复定义同名成员导致成员隐藏
你在基类Employee中已经定义了FirstName、LastName、Patronymic、Salary四个成员,又在派生类Papersworker中重复定义了完全同名的私有成员,会导致两个问题:
- 基类构造函数只会初始化继承自基类的四个成员,派生类自有成员始终处于未初始化的无效状态
ChangeNameSalary、PrintPapersworker方法操作的是派生类自有成员,和基类成员完全无关,数据出现割裂
按照作业要求四个成员必须设为私有的规则,正确写法为:- 把基类的四个成员改为
private修饰 - 基类提供公有的
get/set成员函数,供派生类和外部访问对应成员 - 删掉派生类中重复定义的四个同名成员
2. 其他可优化点
- 基类
operator==的参数改为const Employee& other传引用,避免不必要的对象拷贝 - 不会修改类成员的函数都加上
const修饰,符合const正确性要求 - 字符串类型的入参改为
const std::string&,减少字符串拷贝开销 Coefficient系数表属于所有Papersworker实例共享的固定配置,可以改为static const修饰,避免每个实例都单独存储一份
修正后核心代码示例
基类修改
class Employee { private: // 按照作业要求设为私有 std::string FirstName; std::string LastName; std::string Patronymic; double Salary; public: Employee() {}; explicit Employee(std::string firstName, std::string lastName, std::string patronymic, double salary) : FirstName(std::move(firstName)), LastName(std::move(lastName)), Patronymic(std::move(patronymic)), Salary(salary) {} // 提供读写接口 std::string getFirstName() const { return FirstName; } std::string getLastName() const { return LastName; } std::string getPatronymic() const { return Patronymic; } double getSalary() const { return Salary; } void setFirstName(std::string val) { FirstName = std::move(val); } void setLastName(std::string val) { LastName = std::move(val); } void setPatronymic(std::string val) { Patronymic = std::move(val); } void setSalary(double val) { Salary = val; } bool operator==(const Employee& other) const { return this->FirstName == other.FirstName && this->LastName == other.LastName && this->Patronymic == other.Patronymic; } };
派生类修改
class Papersworker : public Employee { public: Papersworker() {}; using Employee::Employee; const std::string Job = "Papersworker"; // 系数表设为静态全局共享 inline static const std::map<std::string, double> Coefficient = { {"Director", 4.2}, {"Papersworker", 1.2}, {"Guardian", 1.5}, {"Programmer", 2.5} }; void ChangeCoefficient(const std::string& Job, double NewCoefficient) { // 如需修改系数,需去掉Coefficient的const修饰 // Coefficient[Job] = NewCoefficient; } void ChangeNameSalary(const std::string& FirstName, const std::string& LastName, const std::string& Patronymic, double Salary) { setFirstName(FirstName); setLastName(LastName); setPatronymic(Patronymic); setSalary(Salary); } void PrintPapersworker() const { std::cout << "First name\t" << "Lastname\t" << "Patronymic\t" << "Salary\n" << getFirstName() << "\t\t" << getLastName() << "\t" << getPatronymic() << "\t" << getSalary() << "\n" << std::flush; for (const auto& i : Coefficient) { std::cout << i.first << " = " << i.second << ";\t" << std::flush; } std::cout << "\n------------------------------------------------------------\n" << std::flush; } double GetSalary(double baseSalary, const std::string& Job) const { return baseSalary * Coefficient.at(Job); // 用at避免不存在的键自动插入 } };
main函数修改
int main() { Papersworker pwr; double sr = 0.0; std::cout << "\nEnter director's salary\t" << std::flush; std::cin >> sr; // 加endl强制刷新缓冲区 std::cout << "\nSalary\t" << pwr.GetSalary(sr, "Director") << std::endl; return 0; }
内容的提问来源于stack exchange,提问作者Lith
相关产品推荐
相关产品推荐

