Ошибка: функция недоступна - PullRequest
22 голосов
/ 01 мая 2011

Я получаю эту ошибку, но я думал, что получу ее, только если уровень защиты участника был слишком высок и сделал ее недоступной, но я все равно получаю ее.

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 ]

58 голосов
/ 01 мая 2011

Требуется публичное наследование:

 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 ++ вы изучаете?

11 голосов
/ 01 мая 2011

Наследство должно быть публичным:

class Weapon : public Shopable
10 голосов
/ 01 мая 2011

Вы используете личное наследование:

class Weapon : Shopable

То есть тот факт, что Оружие можно купить в магазине, не виден другим классам. Измените его на публичное наследство:

class Weapon : public Shopable
5 голосов
/ 01 мая 2011

class по умолчанию для частного наследования, struct s для общего. Вы используете class, поэтому вам нужно использовать : public Base, если вы хотите смоделировать "is-a":

class Weapon : public Shopable{ // added "public"
4 голосов
/ 01 мая 2011

Вы получаете личное наследование, не указывая ничего другого. Попробуйте вместо этого

class Weapon : public Shopable{
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...