标题和主要模板的指导 - 请寻求最佳实践

时间:2011-09-30 15:20:45

标签: c++ coding-style

我是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()"

有人可以帮助我,为什么我会收到此错误,这种方法是这种设计布局的最佳实践吗?

2 个答案:

答案 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_namename_是安静的常见变量。使用cppcheck可以节省您一些时间/麻烦。

答案 1 :(得分:0)

您需要为默认构造函数character::character()player::player()创建定义。虽然默认构造函数不带参数,但您仍需要为它们提供定义。如果他们什么都不做,甚至没有成员初始化,那么你可以简单地做你为析构函数做的事情:character() { }player() { }

但是,您可以(并且您可能应该)使用初始化列表语法初始化构造函数中的数据成员。例如,对于字符类,它将是:

character() : hp(100), name("Mario") { }

请注意,在}之后您不需要分号。或者你可以使用初始化列表并拥有:

character() {
    hp = 100;
    name = "Mario";
}