我的作业代码计算有误.如何修复
Calculations are wrong in my homework code. How to fix?
我应该这样做:
-
编写一个基类Worker和两个派生类
HourlyWorker
和SalariedWorker
。每个工人都有名字和工资率。 -
编写虚函数
compute_pay(int hours)
,计算每个工人的周工资。小时工在前40小时获得全额工资,超过40小时的工资减半。无论实际工作时数是多少,受薪工人每小时获得40小时的工资。
下面是我的代码,编译没有错误。但是这些计算都是错误的。我希望有人能告诉我我的代码有什么问题。
#include <iostream>
#include <string>
using namespace std;
//////////// Worker /////////////////////////////
class Worker
{
public:
Worker();
Worker(string name, int salary);
void print();
int compute_pay(int hours);
string get_name();
int get_salary();
private:
string name;
int salary;
int payout;
};
Worker::Worker() {salary = 0;}
Worker::Worker(string name, int salary)
{
this->name = name;
this->salary = salary;
}
void Worker::print()
{
cout << "Worker name: " << this->name;
cout << "Salary: " << this->salary;
}
int Worker::compute_pay(int hours)
{
this->payout = this->salary * hours;
return payout;
}
string Worker::get_name() {return this->name;}
int Worker::get_salary() { return this->salary;}
//////////// HourlyWorker ///////////////////////
class HourlyWorker : public Worker
{
public:
HourlyWorker(string name, int salary);
int compute_pay(int hours);
private:
string name;
int salary;
int payout;
};
HourlyWorker::HourlyWorker(string name, int salary)
:Worker(name, salary) {}
int HourlyWorker::compute_pay(int hours)
{
int temp = 0;
if (hours >= 40)
{
temp = (this->salary * (hours - 40)) / 2;
this->payout = (this->salary * 40) + temp;
}
else
{
this->payout = this->salary * hours;
}
return payout;
}
//////////// SalariedWorker /////////////////////
class SalariedWorker : public Worker
{
public:
SalariedWorker(string name, int salary);
int compute_pay(int hours);
private:
string name;
int salary;
int payout;
};
SalariedWorker::SalariedWorker(string name, int salary)
:Worker(name, salary) {}
int SalariedWorker::compute_pay(int hours)
{
this->payout = this->salary * 40;
return payout;
}
/////////
int main()
{
HourlyWorker a("Sam", 20);
HourlyWorker b("Mary", 15);
SalariedWorker c("Tom", 30);
SalariedWorker d("Pat", 40);
cout << "Hourly worker " << a.get_name() << " earns $"
<< a.get_salary();
cout << " and worked 20 hours for a pay of $" << a.compute_pay(20)
<< "n";
cout << "Hourly worker " << b.get_name() << " earns $"
<< b.get_salary();
cout << " and worked 50 hours for a pay of $" << b.compute_pay(50)
<< "n";
cout << "Salaried worker " << c.get_name() << " earns $"
<< c.get_salary();
cout << " and worked 20 hours for a pay of $" << c.compute_pay(20)
<< "n";
cout << "Salaried worker " << d.get_name() << " earns $"
<< d.get_salary();
cout << " and worked 50 hours for a pay of $" << d.compute_pay(50)
<< "n";
return 0;
}
这是我运行它时的结果:
Hourly worker Sam earns $20 and worked 20 hours for a pay of $85081400 Hourly worker Mary earns $15 and worked 50 hours for a pay of $-1915569464 Salaried worker Tom earns $30 and worked 20 hours for a pay of $91731520 Salaried worker Pat earns $40 and worked 50 hours for a pay of $162529280
这就是我想要得到的
Hourly worker Sam earns $20 and worked 20 hours for a pay of $400 Hourly worker Mary earns $15 and worked 50 hours for a pay of $825 Salaried worker Tom earns $30 and worked 20 hours for a pay of $1200 Salaried worker Pat earns $40 and worked 50 hours for a pay of $2000
您的代码中有许多问题。您在计算中看到如此奇数的原因是因为您的每个派生类(HourlyWorker
和SalariedWorker
)都有自己的私有name
, salary
和payout
成员。这些成员与基类中的name
、salary
和payout
成员不同,因为派生类不能直接访问私有成员。
为什么是奇数呢?这是因为您只通过调用基类构造函数来设置salary
。这将设置基类的私有salary
成员,但不设置派生类成员。因此,派生类成员就是内存中恰好位于该位置的任何内容,因此当您将其乘以工作小时数时,您将得到一个非常奇怪的结果。
可以通过使数据成员在基类中受保护,并从派生类定义中删除它们来修复这个问题。(Name仍然可以是私有的,因为你不能在派生类中直接访问它。)这样,当您访问salary
时,您将始终访问具有正确值的基类成员。
一旦你解决了这个问题,你应该会看到合理的数字。然而,据我所知,你的期望值与你给出的赋值定义不相符。你得自己解决这个问题。
除此之外,您还被要求编写一个虚函数,但是您的compute_pay
函数实际上并不是虚的。c++ FAQ中有c++虚函数的一个很好的概述,所以我强烈建议你去看看。简而言之,不同之处在于,如果在基类指针或引用上调用虚函数,而该指针或引用实际上是派生类型,则将调用相应的派生类函数。如果函数是非虚函数,则始终调用基类函数,即使派生类重写了它。
实际上,雇员的工资总是保存到工人类中,而不是保存在小时和工薪类中。因此,无论何时调用"compute_pay",它都会使用垃圾值。因此,要删除它,请在hour和salaried类的构造函数中使用this。
SalariedWorker::SalariedWorker(string name, int salary)
:Worker(name, salary) {this->salary=salary;}
HourlyWorker::HourlyWorker(string name, int salary)
:Worker(name, salary) {this->salary=salary;}
this->salary=salary
将工资也复制到这些类的工资
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- 在计算中使用二的幂有多有利可图
- 静态数据成员的问题-修复链接错误会导致编译器错误
- Boost Graph Library,修复节点大小
- 如何计算文件中的"columns"数?
- 计算排序向量的向量中唯一值的计数
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 如何使用 std::累积在 C++ 中计算总和立方体
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 使用Qt C++计算类似Git的SHA1哈希
- 如何修复函数样式强制转换或类型构造的预期"("?
- OpenCV C++.快速计算混淆矩阵
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- C++如何计算用户输入的数字中的偶数位数
- 我可以在计算数据计划上修复该C 程序的任何建议吗?
- 我的作业代码计算有误.如何修复
- C++猜数字游戏在其他计算机上崩溃并无限循环修复