错误:无法访问功能

时间:2011-04-30 21:01:45

标签: c++ inheritance protection

我收到了这个错误,但我认为如果会员的保护级别太高并且无法访问,我只能得到它,但无论如何我都会得到它。

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'无法访问”

5 个答案:

答案 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{