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

C++中如何从其他类获取成员变量?值不匹配问题求助

问题原因

你遇到的问题本质是对象的独立性:

  • main函数中创建的User user和Computer computer,与Judge类内部定义的User user、Computer computer是完全不同的对象,它们在内存中占据不同的空间,相互之间没有关联。
  • 你在main里调用user.setHand()和computer.setHand(),只是给main里的那两个对象的hand赋值了;但Judge类里的对象是全新构造的,既没有调用setHand方法,也没有被赋值,所以它们的hand成员是未初始化的状态:
    • User的hand输出的7345888是栈内存里的随机垃圾值
    • Computer的hand输出0只是偶然情况,本质也是未初始化的垃圾值
解决方案

这里提供三种可行的修改方案,你可以根据需求选择:

方案一:让Judge接收已初始化的User和Computer对象

修改Judge类的构造函数,让它接收外部的User和Computer对象,将其赋值给内部成员:

#include <iostream>
#include <random>
#include <ctime>

using namespace std;

int random(int low, int high)
{
    return low + rand() % (high - low + 1);
}

class User
{
    public :
        User(){};  //constructor

        int hand;
        void setHand()
        {
            std::cout << "What you choose? (ROCK = 1, SCISSORS = 2, PAPER = 3) := ";
            std::cin>> hand;
        }
};

class Computer
{
    public :
        Computer(){}; //constructor

        int hand;
        void setHand()
        {
            hand = random(1, 3);
            std::cout << "Computer choose := " << hand << std::endl;
        }
};

class Judge
{
    public :
        User user;
        Computer computer;
        
        // 修改构造函数,接收外部的User和Computer对象
        Judge(const User& u, const Computer& c) : user(u), computer(c) {};

        void doJudge()
        {
            std::cout << "User CHOSE hand in class Judge := " << user.hand << std::endl;
            std::cout << "Computer CHOSE hand in class Judge := " << computer.hand << std::endl;

        }
};

int main()
{
    srand(time(NULL));

    User user;
    user.setHand();

    Computer computer;
    computer.setHand();

    // 创建Judge时传入已初始化的对象
    Judge judge(user, computer);
    judge.doJudge();
}

方案二:让Judge持有对象的引用或指针

这种方式可以直接访问main中创建的对象,避免复制:

// 仅修改Judge类部分,其他代码不变
class Judge
{
    public :
        User& user;
        Computer& computer;
        
        // 构造函数接收引用
        Judge(User& u, Computer& c) : user(u), computer(c) {};

        void doJudge()
        {
            std::cout << "User CHOSE hand in class Judge := " << user.hand << std::endl;
            std::cout << "Computer CHOSE hand in class Judge := " << computer.hand << std::endl;

        }
};

// main中创建Judge的代码不变:
Judge judge(user, computer);
judge.doJudge();

方案三:在Judge内部完成User和Computer的初始化

把User和Computer的创建及初始化逻辑放到Judge内部,避免外部创建独立对象:

// 修改main函数和Judge类
class Judge
{
    public :
        User user;
        Computer computer;
        
        Judge(){};

        // 新增初始化方法
        void initPlayers()
        {
            user.setHand();
            computer.setHand();
        }

        void doJudge()
        {
            std::cout << "User CHOSE hand in class Judge := " << user.hand << std::endl;
            std::cout << "Computer CHOSE hand in class Judge := " << computer.hand << std::endl;

        }
};

int main()
{
    srand(time(NULL));

    Judge judge;
    judge.initPlayers();
    judge.doJudge();
}

内容的提问来源于stack exchange,提问作者Yuki Matuzaki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 00:30:09