同一类中方法返回值在另一方法中使用的实现及代码问题咨询
问题分析与解决方案
首先,咱们先揪出你代码里的核心问题:你在calcNetSalary里定义的double salary是局部变量,和类成员private double salary完全是两个毫不相干的变量!所以你调用calcNetSalary后,类的salary成员根本没被赋值,displayNetSalary打印的就是未初始化的垃圾内存值(也就是你看到的类似6.01347e-154的东西)。
要让displayNetSalary用上calcNetSalary的计算结果,有几种常见的实现方式,下面给你逐一说明:
方式1:让calcNetSalary给类成员salary赋值
这是最贴合你现有代码结构的方式——直接把计算结果存到类的成员变量里,这样displayNetSalary就能直接读取这个成员的值了。
修改Employee.cpp里的calcNetSalary方法:
double Employee::calcNetSalary(double basicSalary, double othrs, double otrate) { // 把计算结果赋值给类的成员变量salary,而不是局部变量 this->salary = basicSalary + othrs * otrate; return this->salary; // 可选,保留返回值方便其他场景使用 }
这样修改后,你原来的displayNetSalary不需要改动,调用calcNetSalary后,类成员salary就被正确赋值了,打印出来的就是正确的薪资值。
方式2:通过方法参数传递结果
如果不想依赖类成员变量,也可以让displayNetSalary接收一个参数,直接把calcNetSalary的返回值传进去。
第一步:修改Employee.h的方法声明
// 把displayNetSalary改成带参数的版本 void displayNetSalary(double salary);
第二步:修改Employee.cpp的方法实现
void Employee::displayNetSalary(double salary) { cout << "Net Salary : " << salary; }
第三步:修改Main.cpp的调用逻辑
int main(){ Employee *emp=new Employee(); // 直接把calcNetSalary的返回值传给displayNetSalary emp->displayNetSalary(emp->calcNetSalary(10,20,30)); delete emp; // 别忘了释放new出来的对象,避免内存泄漏 return 0; };
同一类中方法间传递值的常见思路
总结一下,同一类的方法之间传递数据,通常有这几种方式:
- 利用类成员变量:如果数据需要在多个方法间长期共享,把值存在成员变量里是最方便的选择,就像方式1那样。
- 方法参数传递:适合临时传递数据,不需要长期保存的场景,就像方式2,直接把一个方法的返回值作为参数传给另一个方法。
- 链式调用/直接返回值传递:本质和参数传递类似,比如
emp->displayNetSalary(emp->calcNetSalary(...))就是直接把前一个方法的返回值传给后一个方法。
另外提醒你一下:你原来的代码里用new创建了Employee对象,但没有用delete释放,会造成内存泄漏,记得加上delete emp;哦。
内容的提问来源于stack exchange,提问作者Jananath Banuka
相关产品推荐
相关产品推荐

