objects c++ inheritance protection

objects - inheritance c++



Error: la funciĆ³n es inaccesible (5)

Recibo este error, pero pensé que solo lo obtendría si el nivel de protección del miembro fuera demasiado alto y lo hiciera inaccesible, pero lo estoy obteniendo de todos modos

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

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

Algunas líneas en una función aleatoria con la correcta incluyen:

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"


Estás usando herencia privada:

class Weapon : Shopable

Por lo tanto, el hecho de que un arma sea una comprable no es visible para otras clases. Cambiarlo a herencia pública:

class Weapon : public Shopable


La herencia debe ser pública:

class Weapon : public Shopable


Quieres herencia pública:

class Weapon : Shopable

debiera ser:

class Weapon : public Shopable

Además, los nombres como _SHOPABLE_H_ son ilegales en el código C ++ escrito por el usuario, ya que están reservados para la implementación de C ++. Olvídate de los guiones bajos y usa SHOPABLE_H .

Y:

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

debiera ser:

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

para evitar la sobrecarga innecesaria de copiar la cadena.

Es posible que desee replantearse su convención de nomenclatura; por lo general, los nombres de los parámetros de función en C ++ comienzan con una última minúscula. Los nombres que comienzan con letras mayúsculas suelen estar reservados para los tipos definidos por el usuario (es decir, clases, estructura, enumeraciones, etc.)

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


Usted obtiene la herencia privada al no especificar nada más. Prueba esto en su lugar

class Weapon : public Shopable{


class es por defecto a la herencia privada, las struct a públicas. Estás usando class , por lo que necesitas usar : public Base si quieres modelar "is-a":

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