错误:无法访问功能

pig*_*d10 25 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

具有正确性的随机函数中的某些行包括:

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

错误是getName() - "错误:函数'Shopable :: getName'无法访问"

小智 60

你想要公共继承:

 class Weapon : Shopable
Run Code Online (Sandbox Code Playgroud)

应该:

 class Weapon : public Shopable
Run Code Online (Sandbox Code Playgroud)

此外,类似名称_SHOPABLE_H_在用户编写的C++代码中是非法的,因为它们是为C++实现保留的.忘掉领先的下划线并使用SHOPABLE_H.

和:

 Weapon(int Cost,int Damage,std::string Name)
Run Code Online (Sandbox Code Playgroud)

应该:

 Weapon(int Cost,int Damage, const std::string & Name )
Run Code Online (Sandbox Code Playgroud)

避免复制字符串的不必要开销.

您可能想要重新考虑您的命名约定 - 通常,C++中的函数参数名称以小写后者开头.以大写字母开头的名称通常保留给用户定义的类型(即类,结构,枚举等).

感兴趣的是,您从哪个C++教科书中学习?


Gus*_*son 11

继承必须是公开的:

class Weapon : public Shopable
Run Code Online (Sandbox Code Playgroud)


jon*_*son 11

你正在使用私有继承:

class Weapon : Shopable
Run Code Online (Sandbox Code Playgroud)

因此,武器是可购物的这一事实对其他类来说是不可见的.将其更改为公共继承:

class Weapon : public Shopable
Run Code Online (Sandbox Code Playgroud)

  • @Gustav:不,它对于`struct`是公共的,对于`class`是私有的. (4认同)

Bo *_*son 5

您可以通过不指定任何其他内容来获得私有继承。试试这个

class Weapon : public Shopable{
Run Code Online (Sandbox Code Playgroud)


Mar*_*utz 5

classes默认为私有继承,structs为public.您正在使用class,因此: public Base如果您想要模拟"is-a",则需要使用:

class Weapon : public Shopable{ // added "public"
Run Code Online (Sandbox Code Playgroud)