我收到了这个错误,但我认为如果会员的保护级别太高并且无法访问,我只能得到它,但无论如何我都会得到它。
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
具有正确性的随机函数中的某些行包括:
std::map< std::string, Weapon* > weapons;
Weapon* none = new Weapon(0,0,"None");
weapons[none->getName()] = none;
错误是getName() - “错误:函数'Shopable :: getName'无法访问”
答案 0 :(得分:58)
您想要公共继承:
class Weapon : Shopable
应该是:
class Weapon : public Shopable
此外,像_SHOPABLE_H_
这样的名称在用户编写的C ++代码中是非法的,因为它们是为C ++实现保留的。忘记前导下划线并使用SHOPABLE_H
。
和
Weapon(int Cost,int Damage,std::string Name)
应该是:
Weapon(int Cost,int Damage, const std::string & Name )
避免复制字符串的不必要开销。
您可能想要重新考虑您的命名约定 - 通常,C ++中的函数参数名称以小写后者开头。以大写字母开头的名称通常保留给用户定义的类型(即类,结构,枚举等)。
感兴趣的是,您从哪个C ++教科书中学习?
答案 1 :(得分:11)
继承必须是公开的:
class Weapon : public Shopable
答案 2 :(得分:10)
您正在使用私有继承:
class Weapon : Shopable
因此,武器是可购物的这一事实对其他类来说是不可见的。将其更改为公共继承:
class Weapon : public Shopable
答案 3 :(得分:5)
class
默认为私有继承,struct
为公开。您使用的是class
,因此如果您想要模拟“is-a”,则需要使用: public Base
:
class Weapon : public Shopable{ // added "public"
答案 4 :(得分:4)
通过不指定任何其他内容来获得私有继承。试试这个
class Weapon : public Shopable{