web-dev-qa-db-fra.com

Erreur: la fonction est inaccessible

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"

24
pighead10

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?

58
Neil Butterworth

L'héritage doit être public:

class Weapon : public Shopable
11
Gustav Larsson

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
11
jon-hanson

classes par défaut à l'héritage privé, structs à public. Vous utilisez class, vous devez donc utiliser : public Base si vous voulez modéliser "is-a":

class Weapon : public Shopable{ // added "public"
5
Marc Mutz - mmutz

Vous obtenez un héritage privé en ne spécifiant rien d'autre. Essayez ceci à la place

class Weapon : public Shopable{
4
Bo Persson