C++引用传递函数调用后继承类对象成员值异常求助
问题解答
核心问题原因
成员变量未初始化
你的player和avatar类的默认构造函数都没有对x、y进行初始化:player() {} // x、y为未定义的垃圾值 avatar() {} // 继承自player,同样未初始化父类的x、y当你在
main中创建avatar pl;时,pl的坐标成员是未赋值的垃圾数据,这是后续输出错误值的根源。start函数的逻辑误解
你贴出的start函数代码里存在语法错误(用类名avatar调用成员函数),能运行并输出6,8的话,说明你实际代码里大概率是创建了局部的avatar对象(比如avatar temp(6,8);)并输出了它的坐标,而非修改传入的引用av。另外你的player类没有提供修改x、y的公共方法(比如set_x/set_y),就算想用引用修改,也没有合法的途径。main输出语句的语法错误
你写的player.get_x()是错误的,应该用对象名pl,但就算修正,因为pl的坐标从未被赋值,输出的还是垃圾值。
修复方案
1. 完善类的初始化与修改接口
修改player类,添加成员初始化和修改方法:
class player{ private: int x;//coordinates int y; public: // 默认构造函数初始化x、y为0 player() : x(0), y(0) {} // 带参构造用初始化列表更规范 player(int px, int py) : x(px), y(py) {} int get_x() { return x; } int get_y() { return y; } // 添加修改坐标的方法 void set_x(int px) { x = px; } void set_y(int py) { y = py; } }; class avatar : public player { public: avatar() : player() {} // 显式调用父类默认构造 avatar(int px, int py) : player(px, py) { cout << "Make a avatar in this coordinates" << " " << px << " " << py << endl; } };
2. 修正start函数逻辑
确保通过引用修改传入的avatar对象:
void start(avatar &av){ // 修改传入对象的坐标 av.set_x(6); av.set_y(8); // 输出传入对象的坐标 cout << endl << av.get_x() << ", " << av.get_y(); }
3. 修正main函数
int main() { avatar pl; // 现在x、y默认初始化为0 start(pl); // 引用传递,修改pl的坐标为6,8 cout << endl << pl.get_x() << ", " << pl.get_y(); // 正确输出6,8 return 0; }
内容的提问来源于stack exchange,提问作者Manos W.
相关产品推荐
相关产品推荐

