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"