Почему значение отличается при вызове int main и в классе, использующем наследование C ++? - PullRequest
0 голосов
/ 20 мая 2018
#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

Я должен использовать Наследование.

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Вы пытаетесь использовать наследование для структурирования последовательностей связанных действий, которые разделяют состояние члена 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 ++ часто используют его, чтобы сделать код коротким (что совершенно справедливо для коротких фрагментов, которые не используются в других местах).

0 голосов
/ 20 мая 2018

Если я правильно понимаю, проблема в том, что в данный момент 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 объектов и классов, которые ее наследуют,давая вам поведение, которое я верю, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...