【问题标题】: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 未初始化

标签: c++ inheritance


【解决方案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 完全有效)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 2019-10-21
    相关资源
    最近更新 更多