为啥在调用 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());

我做了一些关于足球点球的简单游戏 我有AopsiAopsi 是玩家 A 选择在哪里射击或稍后跳到哪里。

我设置了 Aopsi

 s.setAopsi(a.Akick());

那我就叫它 当 Aopsi 调用 main 时,它被替换为我之前设置的内容。 但是当我在另一个类中调用时,值不会被替换。

例如, 玩家选择 2,然后 Aopsi 从 0 替换为 2。 我尝试在mainA_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_actionA_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++ 的类中值不同?的主要内容,如果未能解决你的问题,请参考以下文章

在继承 C++ 中调用 main 中的参数化构造函数

为啥继承在 Java 和 C++ 中的行为不同,超类调用(或不调用)子类的方法?

为啥 C++ 中的 main() 不能内联?

继承C ++为啥不调用父亲构造函数[重复]

为啥在 C 和 C++ 中的算术运算之前必须将 short 转换为 int?

C++在main中调用类的静态函数