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只是偶然情况,本质也是未初始化的垃圾值
- User的
解决方案
这里提供三种可行的修改方案,你可以根据需求选择:
方案一:让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
相关产品推荐
相关产品推荐

