Je reçois cette erreur, mais je pensais que je ne l'obtiendrais que si le niveau de protection du membre était trop élevé et le rendait inaccessible, mais je l'obtiens quand même.
Shopable.h:
#ifndef _SHOPABLE_H_
#define _SHOPABLE_H_
#include "Library.h"
class Shopable{
private:
std::string Name;
int Cost;
std::string Description;
public:
std::string getName() const{return Name;}
int getCost() const {return Cost;}
virtual std::string getDesc() const = 0;
};
#endif
Weapon.h:
#ifndef _WEAPON_H_
#define _WEAPON_H_
#include "Globals.h"
#include "Shopable.h"
class Weapon : Shopable{
private:
int Damage;
public:
Weapon(int Cost,int Damage,std::string Name) : Cost(Cost), Damage(Damage), Name(Name){}
std::string getDesc() const{
return getName()+"\t"+tostring(Damage)+"\t"+tostring(Cost);
}
int Damage(Entity *target){
int DamageDealt = 0;
//do damage algorithm things here
Special();
return DamageDealt;
}
};
#endif
Une ligne dans une fonction aléatoire avec la bonne comprend:
std::map< std::string, Weapon* > weapons;
Weapon* none = new Weapon(0,0,"None");
weapons[none->getName()] = none;
L'erreur est avec getName () - "Erreur: la fonction 'Shopable :: getName' est inaccessible"
Vous voulez un héritage public:
class Weapon : Shopable
devrait être:
class Weapon : public Shopable
Des noms comme _SHOPABLE_H_
sont illégaux dans le code C++ écrit par l'utilisateur, car ils sont réservés à l'implémentation C++. Oubliez les tirets bas et utilisez SHOPABLE_H
.
Et:
Weapon(int Cost,int Damage,std::string Name)
devrait être:
Weapon(int Cost,int Damage, const std::string & Name )
pour éviter la surcharge inutile de copier la chaîne.
Vous voudrez peut-être repenser votre convention de dénomination - généralement, les noms de paramètres de fonction en C++ commencent par un dernier minuscule. Les noms commençant par des lettres majuscules sont généralement réservés aux types définis par l'utilisateur (c'est-à-dire les classes, les structures, les énumérations, etc.)
Comme question d'intérêt, de quel manuel C++ apprenez-vous?
L'héritage doit être public:
class Weapon : public Shopable
Vous utilisez l'héritage privé:
class Weapon : Shopable
Ainsi, le fait qu'une arme soit une marchandise n'est pas visible pour les autres classes. Modifiez-le en héritage public:
class Weapon : public Shopable
class
es par défaut à l'héritage privé, struct
s à public. Vous utilisez class
, vous devez donc utiliser : public Base
si vous voulez modéliser "is-a":
class Weapon : public Shopable{ // added "public"
Vous obtenez un héritage privé en ne spécifiant rien d'autre. Essayez ceci à la place
class Weapon : public Shopable{