2011-04-30 19 views
19

estoy recibiendo este error, pero pensé que sólo se conseguiría si el nivel de protección del miembro era demasiado alto y lo hizo inaccesible, pero yo estoy poniendo todos modos.de error: La función es inaccesible

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 

Algunos línea en una función aleatoria con la correcta incluye:

std::map< std::string, Weapon* > weapons; 
Weapon* none = new Weapon(0,0,"None"); 
weapons[none->getName()] = none; 

El error es con getName () - "Error: la función 'Shopable :: getName' es inaccesible"

Respuesta

56

¿Quieres herencia pública:

class Weapon : Shopable 

debería ser:

class Weapon : public Shopable 

Además, nombres como _SHOPABLE_H_ son ilegales en el escrito por el usuario código C++, ya que se reservan para la implementación en C++. Olvídese de los caracteres de subrayado iniciales y use SHOPABLE_H.

Y:

Weapon(int Cost,int Damage,std::string Name) 

debería ser:

Weapon(int Cost,int Damage, const std::string & Name) 

para evitar la sobrecarga innecesaria de copiar la cadena.

Es posible que desee volver a pensar su convención de nombres - por lo general, los nombres de parámetros en función de C++ comienzan con una letra minúscula último. Los nombres que comienzan con letras mayúsculas suelen reservarse para los tipos definidos por el usuario (es decir, clases, estructuras, enumeraciones, etc.)

Como cuestión de interés, ¿de qué libro de texto de C++ estás aprendiendo?

+0

No estaba usando un libro de texto, solo recogiendo partes de sitios en Internet. – pighead10

11

La herencia debe ser pública:

class Weapon : public Shopable 
8

Estás usando la herencia privada:

class Weapon : Shopable 

Así que el hecho de que un arma es un Shopable no es visible para otras clases. Cambiarlo a la herencia pública:

class Weapon : public Shopable 
+0

no es la herencia implícita 'protected'? –

+4

@Gustav: no, es público para 'struct', y privado para' clase'. –

+0

@Mike Tuve que verificar porque tenía curiosidad, y tienes toda la razón. –

4

Usted recibe la herencia privada si no especifica otra cosa. Tal vez puedas probar

class Weapon : public Shopable{ 
5

class es por defecto a la herencia privada, struct s al público. Estás usando class, por lo que es necesario utilizar : public Base si se desea modelar "is-a":

class Weapon : public Shopable{ // added "public" 
Cuestiones relacionadas