我是C ++的新手,在使用最佳编码实践方面需要一些帮助。基本上我用以下数据创建了我的头文件(character.h):
using namespace std;
class character
{
//available to all
public:
character();
~character(){};
int getHP(){return hp;};
int damage(int _damage);
int levelUp(int _xp);
void setHP(int _hp){hp = _hp;};
string getName(){return name;};
protected:
int hp;
string name;
};
class player:public character
{
public:
player();
~player(){};
protected:
string name;
int lvl;
int xp;
};
class enemy:public character
{
public:
enemy(string _name, int _hp);
~enemy(){};
protected:
string name;
int lvl;
int xp;
};
我试图从这个数据生成主文件(main.cpp)
#include "character.h"
player::player()
{
cout << "\t\t\nPlease enter your name: \n\t\t";
cin >> name;
};
int main()
{
//some code
return 0;
}
但我一直在犯错误
"undefined reference to `character::character()"
有人可以帮助我,为什么我会收到此错误,这种方法是这种设计布局的最佳实践吗?
答案 0 :(得分:0)
您需要在代码文件中定义字符的构造函数:
character::character():
hp(10),
name("default")
{
}
character::character (std::string name): hp(10) [...]
character::character (int hp): name("Default") [...]
character::character (std::string name, int hp) [...]
这可确保定义所有实例变量。
由于您定义了析构函数,因此必须遵守rule of three并定义复制构造函数和赋值运算符。
在旁注中,您应该使用约定来命名您的类/实例变量:myName
,_name
或name_
是安静的常见变量。使用cppcheck可以节省您一些时间/麻烦。
答案 1 :(得分:0)
您需要为默认构造函数character::character()
和player::player()
创建定义。虽然默认构造函数不带参数,但您仍需要为它们提供定义。如果他们什么都不做,甚至没有成员初始化,那么你可以简单地做你为析构函数做的事情:character() { }
和player() { }
。
但是,您可以(并且您可能应该)使用初始化列表语法初始化构造函数中的数据成员。例如,对于字符类,它将是:
character() : hp(100), name("Mario") { }
请注意,在}
之后您不需要分号。或者你可以不使用初始化列表并拥有:
character() {
hp = 100;
name = "Mario";
}