为啥在调用 int main 和在使用继承 C++ 的类中值不同?
Posted
技术标签:
【中文标题】为啥在调用 int main 和在使用继承 C++ 的类中值不同?【英文标题】:Why value is different when called int main and in a class using inheritance C++?为什么在调用 int main 和在使用继承 C++ 的类中值不同? 【发布时间】:2018-05-20 03:39:54 【问题描述】:#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 = scoreA + 1;
;
class A_action: public Score
public :
int Akick()
int opsi;
cout << "Team A Select where to kick : ";
cin >> opsi;
return opsi;
;
class A_after: public Score
public :
int A_shot()
cout << Aopsi <<endl;
int opsiA = 0; //i update the code for shorter code, so if goal opsiA = 1
return opsiA; //opsiA and Aopsi is different
;
int main()
Score s;
A_action a;
A_after A;
s.setAopsi(a.Akick());
cout << s.Aopsi <<endl;
s.goalA(A.A_shot());
我做了一些关于足球点球的简单游戏
我有Aopsi
。 Aopsi
是玩家 A 选择在哪里射击或稍后跳到哪里。
我设置了 Aopsi
s.setAopsi(a.Akick());
那我就叫它
当 Aopsi 调用 main
时,它被替换为我之前设置的内容。
但是当我在另一个类中调用时,值不会被替换。
例如,
玩家选择 2,然后 Aopsi 从 0 替换为 2。
我尝试在main
和A_after
类函数A_shot
上计算它。
那么输出就不一样了。
Aopsi
main
= 2
Aopsi
A_shot
= 0
应该是
Aopsi
main
= 2
Aopsi
A_shot
= 2
我必须使用继承。
【问题讨论】:
你试过使用调试器吗? 请仅发布不起作用的代码以及您期望发生的情况。现在,您的描述和您发布的代码令人困惑。您正在混合您所说的工作,不工作,已注释掉的行和未注释掉的行等。 您说您已经“在s.setAopsi(b.Bkick())
上设置Aopsi”,但您显示的代码中没有这样的声明。提供minimal reproducible example 意味着提供其他人可以用来重现您遇到的相同问题的代码。你没有提供,所以没有人可以提供帮助。
请不要更新“我上面写的是错的,应该是这个”。只需修正你写的内容,这样就正确了。
scoreA
未初始化
【参考方案1】:
如果我理解正确,您遇到的问题是当前 Aopsi
是该类的成员变量,对于您为 Score
A_action
和 A_after
类声明的每个实例都是唯一的。由于您声明Aopsi
的方式是这样的,因此您将获得您描述的结果是完全有效的行为,因为已通过调用s.setAopsi(a.Akick());
为对象Score s
更新了Aopsi
变量。但是,此调用不会像您认为的那样更新A_after A;
对象的Aopsi
变量。要获得这种行为,您必须像这样声明Score
:
class Score
public :
int scoreA = 0;
static int Aopsi = 0;
void setAopsi(int a)
this->Aopsi = a;
void goalA(int a)
if (a==1)scoreA = scoreA + 1;
;
这将Aopsi
声明为一个静态变量,对于继承它的所有Score
对象和类都是相同的,从而为您提供我认为您想要的行为。
【讨论】:
static
不太可能是解决此问题的正确方法。尽管如此,OP 还是觉得值得学习。
@BenVoigt 我完全同意你的看法,我认为一个好的方法是完全重新调整类本身的结构......【参考方案2】:
您正在尝试使用继承来构建序列 共享成员 aopsi 状态的相关操作。但是,您正在使用每个 Score 派生类的不同实例。这样,每个实例都会有自己独立的状态。
您可以通过使A_after
派生自A_action
来保持您的结构,只创建A_after a
的实例并对a
执行所有操作。
a.setAopsi(a.Akick());
a.goalA(a.A_shot());
您可以为每个玩家执行此操作。还要确保在你的类定义中初始化scoreA = 0
。
(对 aopsi 使用静态将不起作用,此后您无法为每个玩家设置 aopsi)。
顺便说一句,避免在头文件中使用using namespace std
。 C++ 示例经常使用它来保持代码简短(这对于其他地方没有使用的短 sn-ps 完全有效)。
【讨论】:
以上是关于为啥在调用 int main 和在使用继承 C++ 的类中值不同?的主要内容,如果未能解决你的问题,请参考以下文章
为啥继承在 Java 和 C++ 中的行为不同,超类调用(或不调用)子类的方法?