C++中为何main函数与继承类中Aopsi的取值不同?
问题分析与解决方案
你遇到的核心问题是对象实例的独立性:你在代码里创建了三个完全独立的对象——Score s、A_action a、A_after A。由于A_action和A_after都直接继承自Score,每个子类对象都会复制一份Score的成员变量(包括Aopsi)。你给s的Aopsi赋值,但A这个A_after对象的Aopsi是它自己的独立变量,初始值还是0,这就是两处输出不一致的根本原因。
按照你的要求用继承解决问题,我们可以调整类的继承结构,让A_after继承自A_action,这样A_after对象就能共享A_action继承来的Score成员变量,所有操作都针对同一个对象的状态,自然就能保持Aopsi的一致性。
修改后的完整代码
#include <iostream> using namespace std; class Score{ public : int scoreA, Aopsi = 0; void setAopsi(int a){ this->Aopsi = a; } void goalA(int a){ if (a == 1) scoreA += 1; } }; // A_action继承自Score,负责获取玩家的射门方向选择 class A_action: public Score{ public : int Akick(){ int opsi; cout << "Team A Select where to kick : "; cin >> opsi; return opsi; } }; // A_after继承自A_action,共享同一个Score基类的成员变量 class A_after: public A_action{ public : int A_shot(){ cout << Aopsi << endl; // 现在这里的Aopsi和设置的是同一个变量 int opsiA = 1; // 示例直接返回1代表进球,你可以根据实际逻辑修改 return opsiA; } }; int main(){ // 只创建一个A_after对象,它包含A_action和Score的所有成员与方法 A_after A; // 调用自身的Akick获取选择,然后设置自身的Aopsi A.setAopsi(A.Akick()); cout << A.Aopsi << endl; // 输出正确的玩家选择值 // 调用自身的A_shot处理射门逻辑,此时Aopsi已被正确更新 A.goalA(A.A_shot()); }
为什么这样能解决问题?
A_after继承自A_action,而A_action又继承自Score,所以A_after对象只拥有一份Score的成员变量(包括Aopsi)。- 在
main中我们只使用一个A_after对象,所有操作(获取射门方向、设置Aopsi、处理射门逻辑)都针对这个对象的同一个Aopsi变量,自然不会出现值不一致的情况。
内容的提问来源于stack exchange,提问作者Dihyan Fauzana Rosadi
相关产品推荐
相关产品推荐

