1. ホーム
  2. c++

[解決済み] エラーになりました。関数にアクセスできません

2022-02-08 15:27:32

質問

このエラーが出るのですが、メンバーの保護レベルが高すぎてアクセス不能になった場合のみ出ると思っていたのですが、とにかく出るんです。

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' is inaccessible"

どうすればいいですか?

パブリックインテリジェンスを行いたい。

 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++の教科書で学んでいるのですか?