2017-05-05 2 views
-2

J'ai une question sur les variables protégées. Peut-être que je ne les ai pas vraiment compris mais n'est pas la raison de les utiliser, que les classes d'enfants peuvent les utiliser? Globalement, je veux diminuer les points de vie.Impossible d'accéder à la variable int protégée du pointeur Classe parente

Voici mon code: fichier d'en-tête

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); 
}; 

classe Fighter:

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

Classe Guerrier

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

Quelle est votre erreur? –

+0

Sur membre Fighter :: points de vie ne peut pas accéder "à travers" "Fighter" -pointer (sry pour mon englisch) –

+0

Il est certainement un doublon, et il y a même une solution de contournement disponible dans le dup lié http://stackoverflow.com/ a/1414851/817643 – StoryTeller

Répondre

-1

Question similaire comme dans Protected data in parent class not available in child class?

La solution est de faire:

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

fonction public dans Fighter, et appeler (également enlever la duplication de code).

+1

Votre question que vous avez liée est une copie exacte, marquez-la comme une seule et non comme une réponse à la question. –

+0

ce lien ne m'aide pas vraiment du tout, mais thx –

-1

Vous pouvez uniquement accéder aux membres protégés dans les instances de votre type (ou dérivées de votre type). Vous ne pouvez pas accéder aux membres protégés d'une instance d'un type parent ou cousin. Dans votre cas, la classe Dérivée ne peut accéder qu'au membre b d'une instance dérivée et non à une instance de base différente. La modification du constructeur pour prendre une instance dérivée résoudra également le problème.

Trouvé Accessing protected members in a derived class.

Ce qui signifie dans votre cas que vous ne pouvez pas accéder au point de vie d'un combattant, mais seulement à un guerrier.

Eh bien cela pourrait fonctionner, mais je suppose que ce n'est pas ce que vous essayez de faire:

void Warrior::attackFighter(Warrior* w)' 

Une autre solution est d'appeler dans l'attaque de guerrier

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

Vous pouvez gérer au changement le comportement de Fighter::attackFighter de toute façon, par exemple:

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. 
} 

Ce n'est pas très subtile mais je suis sûr que vous avez compris les différentes possibilités que vous avez pour éviter votre problème.

+0

ouais je l'ai lu avant, comment puis-je résoudre ce problème? –

+0

@DavidWalser J'ai édité ma réponse pour vous donner quelques conseils. Je n'ai pas fait ça pour voir si ça fonctionne, mais ça devrait l'être. – Badda