为什么在使用继承C ++调用int main和类时值是不同的?

时间:2018-05-20 03:39:55

标签: c++ inheritance

#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。 我尝试在main和课程A_after函数A_shot上投放该广告。 然后输出是不同的。

Aopsi = 2

上的

main Aopsi = 0

上的

A_shot

应该是

Aopsi = 2

上的

main Aopsi = 2

上的

A_shot

我必须使用继承。

2 个答案:

答案 0 :(得分:0)

如果我理解正确,那么您遇到的问题是,当前Aopsi是该类的成员变量,对于您为Score A_action声明的每个实例而言都是唯一的A_after个班级。由于您声明Aopsi的方式是这样做的,因此您获得所描述的结果是完全有效的行为,因为已为对象Aopsi更新了Score s变量电话s.setAopsi(a.Akick());。但是,此调用不会像您认为的那样更新Aopsi对象的A_after A;变量。要获得该行为,您必须像这样声明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对象和类都是相同的,为您提供我认为您想要的行为。

答案 1 :(得分:0)

您正在尝试使用继承来构建序列 分享成员aopsi状态的相关行动。但是,您使用的是每个Score派生类的不同实例。这样,每个实例都将拥有自己独立的状态。

您可以通过从A_after派生A_action来保持您的结构,只创建A_after a的实例,并在a上执行所有操作。

a.setAopsi(a.Akick());
a.goalA(a.A_shot());

这可以为每个玩家做。还要确保在类定义中初始化scoreA = 0

(对aopsi使用static不起作用,因为你不能为每个玩家设置aopsi。)

顺便说一句,请避免在头文件中使用using namespace std。 C ++示例通常使用它来保持代码简短(这对于其他地方没有使用的短片段非常有效。)