You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++引用传递函数调用后继承类对象成员值异常求助

问题解答

核心问题原因

  1. 成员变量未初始化
    你的player和avatar类的默认构造函数都没有对x、y进行初始化:

    player() {} // x、y为未定义的垃圾值
    avatar() {} // 继承自player,同样未初始化父类的x、y
    

    当你在main中创建avatar pl;时,pl的坐标成员是未赋值的垃圾数据,这是后续输出错误值的根源。

  2. start函数的逻辑误解
    你贴出的start函数代码里存在语法错误(用类名avatar调用成员函数),能运行并输出6,8的话,说明你实际代码里大概率是创建了局部的avatar对象(比如avatar temp(6,8);)并输出了它的坐标,而非修改传入的引用av。另外你的player类没有提供修改x、y的公共方法(比如set_x/set_y),就算想用引用修改,也没有合法的途径。

  3. 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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 03:35:45