2017-05-05 94 views
-2

我有一个关于受保护变量的问题。也许我没有真正理解他们,但不是使用它们的原因,孩子们可以使用它们吗?总的来说,我想减少生命点。无法访问指针的受保护的int变量父类

这里是我的代码: 头文件

class Fighter { 
protected: 
    int offensePoints; 
    int defensePoints; 
    int lifepoints; 
    std::string name; 
public: 
    Fighter(const std::string n); 
    virtual ~Fighter(); 
    virtual void attackFighter(Fighter * f); 
    int randomval(int min, int max); 
    bool isalive(); 
    void isattacked(Fighter * at, int dmg); 
}; 

class Warrior : public Fighter 
{ 
public: 
    Warrior(const std::string n); 
    virtual ~Warrior(); 
    void attackFighter(Fighter * f); 
    int randomval(int min, int max); 
    bool isalive(); 
    void isattacked(Fighter * at, int dmg); 
}; 

一流的战斗机:

void Fighter::attackFighter(Fighter * f) 
{ 
    if (isalive()) 
    { 
     f->lifepoints -= randomval(0, offensePoints); 
    } 
} 

级战士

void Warrior::attackFighter(Fighter * f) 
{ 
    if (isalive()) 
    { 
     f->lifepoints -= randomval(0, offensePoints); 
    } 
} 
+1

你的错误是什么? –

+0

在成员Fighter :: lifepoints不能访问“通过”“战斗机” - 指针(为我的英语sry) –

+0

它绝对是一个重复,甚至有一个解决方法可用链接复制http://stackoverflow.com/ a/1414851/817643 – StoryTeller

回答

-1

类似的问题在Protected data in parent class not available in child class?

的解决方案是:

void Fighter::Attacked(int offensePoints) { 
    if (isalive()) 
    { 
     lifepoints -= randomval(0, offensePoints); 
    } 
} 

在战斗机公共功能,并调用(也消除代码重复)。

+1

您链接的问题是完全重复的,请将其标记为一个而不是回答问题。 –

+0

这个链接真的没有帮助我,但thx –

-1

你只能访问受保护的成员在类型的实例(或从你的类型派生的)。 您无法访问父代或表亲类型实例的受保护成员。 就你而言,Derived类只能访问Derived实例的b成员,而不能访问其他Base实例。 更改构造函数以获取Derived实例也将解决此问题。

Found there Accessing protected members in a derived class

这意味着在你的情况下,你不能进入战斗机的生命点,但只能对战士进行。

嗯,这可以工作,但我想这不是你正在尝试做的事:

void Warrior::attackFighter(Warrior* w)' 

另一种解决方法是调用战斗机的功能attackFighter勇士的内线进攻

void Warrior::attackFighter(Fighter * f) 
{ 
    Fighter::attackFighter(f); 
} 

你可以设法改变无论如何Fighter::attackFighter的行为,例如:

void Warrior::attackFighter(Fighter * f) 
{ 
    Fighter::attackFighter(f); 
    Fighter::attackFighter(f); // This way, a warrior would attack twice when a simple fighter would only attack once. 
} 

这不是很微妙,但我相信你明白你必须避免你的问题的不同可能性。

+0

是的,我读过之前,我该如何解决这个问题? –

+0

@DavidWalser我编辑了我的答案给你一些提示。我没有运行这个看看它是否有效,但它应该。 – Badda