Ошибка: функция недоступна
Я получаю эту ошибку, но я думал, что я только получу ее, если уровень защиты членов будет слишком высоким и сделает его недоступным, но я все равно получаю его.
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 "недоступна"
Ответы
Ответ 1
Вы хотите публичное наследование:
class Weapon : Shopable
должен быть:
class Weapon : public Shopable
Кроме того, имена, подобные _SHOPABLE_H_
, являются незаконными в написанном пользователем С++-коде, поскольку они зарезервированы для реализации на С++. Забудьте о ведущих символах подчеркивания и используйте SHOPABLE_H
.
и
Weapon(int Cost,int Damage,std::string Name)
должен быть:
Weapon(int Cost,int Damage, const std::string & Name )
чтобы избежать ненужных накладных расходов на копирование строки.
Возможно, вы захотите переосмыслить свое соглашение об именах - обычно имена функциональных параметров в С++ начинаются с нижнего регистра последнего. Имена, начинающиеся с прописных букв, обычно зарезервированы для пользовательских типов (например, классов, структуры, перечислений и т.д.).
Как интересно, какой учебник на С++ вы изучаете?
Ответ 2
Наследование должно быть общедоступным:
class Weapon : public Shopable
Ответ 3
Вы используете личное наследование:
class Weapon : Shopable
Таким образом, тот факт, что Weapon является Shopable, не отображается другим классам. Измените это на публичное наследование:
class Weapon : public Shopable
Ответ 4
class
es по умолчанию для частного наследования, struct
для общего доступа. Вы используете class
, поэтому вам нужно использовать : public Base
, если вы хотите моделировать "is-a":
class Weapon : public Shopable{ // added "public"
Ответ 5
Вы получаете частное наследство, не указывая ничего другого. Попробуйте это вместо
class Weapon : public Shopable{