请将这段代码拆开,让它变得复杂且几乎无法读取,我宁愿学习一次又一次,而不是多次以错误的方式学习同样的东西。
基类如下:
class baseMob{
private:
int _healthMax;
int _healthCurrent;
int _manaMax;
int _manaCurrent;
int _experiencePoints;
public:
//Set max Hp
void setHealthMax(int);
//Get max Hp
int getHealthMax();
//Set Current Hp
void setCurrentHealth(int);
//Get Current Health
int getCurrentHealth();
//Set Max Mana
void setMaxMana(int);
//Get Max Mana
int getMaxMana();
//Set Current Mana
void setCurrentMana(int);
//Get Current Mana
int getCurrentMana();
//getMob Exp on kill
int getExperiencePoints();
//Set mob Exp points
void setExperiencePoints(int);
//leaving out the member functions for space conservation
};
我正在尝试创建的个人暴徒是一个绿色的粘液,我正试图通过我制作的默认构造函数创建...
class greenSlime: private baseMob{
public:
greenSlime(){
setHealthMax(100);
setMaxMana(100);
setCurrentHealth(100);
setCurrentMana(100);
setExperiencePoints(150);
}
};
我的主要功能现在看起来像这样:
greenSlime slime();
for(; slime.getCurrentHealth() >= 0; slime.setCurrentHealth(-1)){
cout << "The current health of the slime is: " << slime.getCurrentHealth() << endl;
if (slime.getCurrentHealth() <= 0 ){
cout << "Player is awarded with: " << slime.getExperiencePoints() << " Experience. ";
}
}
如果有人想撕掉它并让我看起来像个傻瓜,我真的很感激帮助。
我目前得到的错误是:
Project1.cpp:107:错误:请求成员getCurrentHealth' in
slime',这是非类型的类型`greenSlime()()'
与其他相同类型的错误一起。
Tl; Dr:班级实施不起作用,发布了我的所有来源,当我可能已经发布了大约十分之一并且仍然有意义,并且很想有人告诉我为什么它不起作用以及如何我很糟糕。
答案 0 :(得分:3)
问题是编译器认为粘液声明行是另一种类型的预解释,因为greenSlime没有带参数的ctor。
您可以通过不在粘液之后放置括号来修复它。
// greenSlime slime();
greenSlime slime;
对于您不理解的奇怪错误,我可以提供绝对最好的建议。提出一个较小的问题示例,可以更容易地发现实际上错误的内容。
这是我写的测试内容。
struct Foo {
Foo() {}
void bar() {}
};
int main(int argc, char ** argv) {
Foo foo;
foo.bar();
return 0;
}
答案 1 :(得分:1)
class greenSlime: private baseMob{
应该是:
class greenSlime: public baseMob{
由于您继承的课程是私立,因此您无法看到任何继承的方法。
此外,Tom Kerr所说的,在声明对象后,你不想要括号。基本上,如果您不想要任何参数,请在制作对象时不要使用括号。
答案 2 :(得分:1)
另外,我想你会遇到的下一件事:你几乎不想要private inheritance,至少除非你知道你真的想要它。我猜你的意思是greenSlime的类声明
class greenSlime: public baseMob
答案 3 :(得分:1)
其他人已经指出了代码无效的问题。我会就程序设计提出建议。
在解释继承时,教程和编程类经常使用与您的代码非常相似的玩具示例。这些示例显示了继承是什么,但实际上并不是很擅长显示继承对哪些有用。
在这种情况下我不会使用继承。我认为更好的设计是拥有一个代表暴徒类型的类,并保存所有那种类型的暴徒的静态数据,例如暴徒名称,起始/最大HP,攻击类型等。然后有另一个类,其中每个实例代表一个特定的暴徒并保存为该暴徒改变的数据,例如当前的hp。
class Mob_type {
string name;
int max_hp;
vector<shared_ptr<Attack_type>> attacks;
public:
Mob_type(string name,int max_hp,vector<shared_ptr<Attack_type>> attacks)
: name(name),max_hp(max_hp),attacks(attacks) {}
int get_max_hp() const { return max_hp; }
};
class Mob {
Mob_type const &type;
int hp;
public:
Mob(Mob_type const &type) : type(type), hp(type.get_max_hp()) {}
Mob_type const &get_type() const { return type; }
int get_hp() const { return hp; }
};
void print_health(Mob const &m) {
cout << m.get_hp() << '/' << m.get_type().get_max_hp() << '\n';
}
int main() {
vector<shared_ptr<Attack_type>> attacks; // ...
Mob_type green_slime("Green Slime",50,attacks);
Mob green_slime_A(green_slime), green_slime_B(green_slime);
fight(green_slime_A,green_slime_B);
cout << "A: ";
print_health(green_slime_A);
cout << "B: ";
print_health(green_slime_B);
}
通过这种方式,您可以拥有一个包含mob类型的数据文件,而添加类型所需要做的就是更新数据文件。
答案 4 :(得分:0)
首先,如果你进行私有继承,你将无法访问任何基类的函数。公共继承允许您访问基类的公共和受保护函数和成员。
其次,如果你想制作一个greenSlime类的指针,你必须这样做:
//greenSlime() with parentheses
greenSlime *slime = new greenSlime();
但是如果你想用非参数构造函数(默认构造函数)创建greenSlime的对象,你必须这样做:
//without parentheses
greenSlime slime;