2017-02-20 90 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.然后通过调用monsterAttack,我应该输出3,是吗?

除了不起作用。它每次输出零。我究竟做错了什么?如果我将Parent类中的变量设置为等于Child类中的某个变量,那么如何才能真正更改Parent类中的变量,以便可以在Child类中访问这个新变化的变量?

谢谢!!

+1

请作出[mcve]。您的代码由于各种不相关的原因而无法编译,因此很难找到实际问题。 – nwp

+0

我建议你从编译你的例子开始,编译器是你的朋友,并会告诉你你做错了什么。一些提示:ninjaAttack和monsterAttack不是Parent类的方法,所以你不能在指向Parent类的指针上调用它们。 现在你的问题 - 当你打电话给ninjaAttack,你减少你称为方法的忍者对象的生命数 - 这不会改变不同对象的生命值 – Amnon

+0

感谢您的评论,我会让它编译 – FKAjasmine

回答

0

MonsterNinja是两个不同的类别。显示的代码初始化两个不同的对象。这两个对象是完全独立的。类的构造函数Ninja及其ninjaAttack()方法初始化并修改其中一个对象的life

monsterAttack()方法是为了打印它life成员在第二对象上调用,但对象绝对没有的事,无论如何,与Ninja对象,其life被减少到3 Monsterlife从未初始化,并打印其值导致未定义的行为。 0的输出是这种未定义行为的一种可能结果。

+0

谢谢。所以如果我想使用两个类都可以访问的变量,那么我会怎么做?就像我想让一个阶级的攻击减少他人的生命一样? – FKAjasmine

+0

根据情况而定,指针或静态类成员。 –

+0

嗨,谢谢。我仍然遇到麻烦。我这样试了:我在父类中做了一个指针(* DM)变量。然后我在父类中做了一个int(“HP”)。然后,在一个子类中,我将指针分配给int的地址(DM =&HP)。然后,仍然在子类中,我使用间接运算符通过DM为DM分配一个值(* DM = 123456)。问题是,当我从另一个孩子班级打电话给惠普时,它仍然显示为零。我很困惑!谢谢!! – FKAjasmine

-1

一些言论:

  • 声明monsterLife但你定义monsterAttack
  • 两个构造NinjaMonster是私有的,所以你不能把它直接

回到你的问题,我认为你可以使用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

这里的所有实例共享'生命'变量 –

相关问题