2017-02-20 6 views
0

저는 다형성을 배우는 프로그래밍 할당 작업을하고 있습니다. 우리는 부모 클래스와 하위 클래스를 사용하여 간단한 전투 게임을 만들고 있습니다.다른 하위 클래스의 변수에 액세스하는 방법을 모르겠습니다.

기본 구조는 이것이다 : 닌자를 초기화하여, 그래서 본질적으로

class Parent 
{ 
protected: 
    int life; 
}; 

class Ninja : public Parent 
{ 
private: 
    Ninja (int x); 
    void ninjaAttack(); 
}; 

Ninja::Ninja (int x) : Parent() 
{ 
life = x; 
} 

Class Monster : public Parent 
{ 
private: 
    Monster(); 
    void monsterLife(); 
}; 

Monster::Monster() : Parent() 
{ 
} 

void Ninja::ninjaAttack() 
{ 
    life = (life-1); 
} 

void Monster::monsterAttack() 
{ 
cout << life << endl; 
} 

int main() 
{ 
    Ninja n1 (4); 
    Monster m2; 

    Parent * p1 = &n1; 
    Parent * p2 = &m1; 

    p1 -> ninjaAttack(); 
    p2 -> monsterAttack(); 

    return 0; 
} 

을, 난 지금, 부모 :: 생활 = 4을해야 하는가? 그리고 나서 닌자 공격 (ninjaAttack)을 실행하여 '생명력'을 3으로 낮 춥니 다. 몬스터 공격을 부름으로써 3을 출력해야합니다.

예외 : 작동하지 않는 경우. 매번 0을 출력합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? Parent 클래스의 변수를 Child 클래스의 값으로 설정하면 Parent 클래스의 변수를 실제로 어떻게 변경할 수 있습니까? 이렇게 변경된 새 변수는 Child 클래스에서 액세스 할 수 있습니까?

감사합니다.

+1

[mcve]를 작성하십시오. 관련없는 여러 가지 이유로 코드가 컴파일되지 않아 실제 문제를 찾는 것이 매우 어렵습니다. – nwp

+0

예제를 컴파일하여 시작하는 것이 좋습니다. 컴파일러는 여러분의 친구이며 잘못하고있는 것에 대한 통찰력을 줄 것입니다. 힌트 : ninjaAttack 및 monsterAttack은 Parent 클래스의 메서드가 아니므로 Parent 클래스에 대한 포인터에서 호출 할 수 없습니다. 질문에 - 이제 ninjaAttack을 호출하면 메서드를 호출 한 닌자 개체의 수명이 단축됩니다.이 메서드는 다른 개체의 수명 값을 변경하지 않습니다 – Amnon

+0

주석 주셔서 감사합니다. – FKAjasmine

답변

0

MonsterNinja은 두 개의 다른 클래스입니다. 표시된 코드는 두 개의 다른 객체를 초기화합니다. 이 두 객체는 ​​서로 완전히 독립적입니다. Ninja 클래스의 생성자 및 해당 ninjaAttack() 메서드는 개체 중 하나의 life을 초기화하고 수정합니다.

life 회원의 인쇄하기 위해 monsterAttack() 방법은 두 번째 객체에서 호출하지만, 그 객체가 그 life 3. Monster의로 감소했다 life가 초기화되지 않습니다 된 Ninja 개체, 무엇이든지, 아무 상관이 없죠 그 값을 인쇄하면 정의되지 않은 동작이 발생합니다. 0의 출력은이 정의되지 않은 동작의 한 가능한 결과입니다.

+0

고맙습니다. 따라서 두 클래스 모두에서 액세스 할 수있는 변수를 사용하려면 어떻게해야할까요? 한 클래스의 공격으로 다른 사람의 생명을 감소시키고 싶었던 것처럼? – FKAjasmine

+0

상황에 따라 포인터 또는 정적 클래스 멤버. –

+0

안녕하세요, 감사합니다. 나는 아직도 문제가있다. 나는이 방법으로 시도 : 나는 부모 클래스에서 포인터 (* DM) 변수를 만들었습니다. 그런 다음 상위 클래스에서 int ("HP")를 만들었습니다. 그런 다음 자식 클래스에서 int (DM = & HP)의 주소에 포인터를 할당했습니다.그런 다음 하위 클래스에서 간접 연산자를 사용하여 DM (* DM = 123456)을 통해 HP에 값을 할당했습니다. 문제는 다른 하위 클래스에서 HP에 전화 할 때 여전히 0으로 표시된다는 것입니다. 난 너무 혼란 스러워요! 감사!! – FKAjasmine

-1

일부 발언 :

    당신이 monsterLife 선언
  • 하지만 NinjaMonster 당신이 그것을 호출 할 수 있도록 직접

가 문제로 돌아 가자, 사립 monsterAttack

  • 두 생성자를 정의 , 당신은 static 변수를 사용할 수 있다고 생각합니다. 예 :

    #include <iostream> 
    
    using namespace std; 
    
    class Parent 
    { 
    protected: 
        static int life; 
    }; 
    
    int Parent::life = 0; 
    
    class Ninja : public Parent 
    { 
    public: 
        Ninja (int x); 
        void ninjaAttack(); 
    }; 
    
    Ninja::Ninja (int x) : Parent() 
    { 
        Parent::life = x; 
    } 
    
    class Monster : public Parent 
    { 
    public: 
        Monster(); 
        void monsterLife(); 
    }; 
    
    Monster::Monster() : Parent() 
    { 
    } 
    
    void Ninja::ninjaAttack() 
    { 
        Parent::life = Parent::life-1; 
    } 
    
    void Monster::monsterLife() 
    { 
        cout << Parent::life << endl; 
    } 
    
    int main() 
    { 
        Ninja n1 (4); 
        Monster m2; 
    
        n1.ninjaAttack(); 
        m2.monsterLife(); 
    
        return 0; 
    } 
    
  • +0

    모든 인스턴스는 여기에'life' 변수를 공유합니다. –

    관련 문제