带有标题和主模板的指南-请寻求最佳实践 我是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; };

带有标题和主模板的指南-请寻求最佳实践 我是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; };,c++,coding-style,C++,Coding Style,我试图从这些数据生成主文件(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; } 有人能帮我一下吗?为什么我会遇到这个错误?这种方法也是这种设计布局的最佳实践吗?您需要在代码文件中定义字符

我试图从这些数据生成主文件(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;
}

有人能帮我一下吗?为什么我会遇到这个错误?这种方法也是这种设计布局的最佳实践吗?

您需要在代码文件中定义字符的构造函数:

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) [...]
这确保定义了所有实例变量

由于您定义了析构函数,因此必须遵守并定义复制构造函数和赋值运算符


另一方面,您应该使用约定来命名类/实例变量:
myName
\u name
name
非常常见。使用也可以节省一些时间/麻烦。

您需要在代码文件中为字符定义构造函数:

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) [...]
这确保定义了所有实例变量

由于您定义了析构函数,因此必须遵守并定义复制构造函数和赋值运算符


另一方面,您应该使用约定来命名类/实例变量:
myName
\u name
name
非常常见。使用可以节省一些时间/麻烦。

您需要做的是为默认构造函数
character::character()
player::player()
创建定义。虽然默认构造函数不接受参数,但仍然需要为它们提供定义。如果它们什么都不做,甚至不进行成员初始化,那么您可以简单地执行为析构函数所做的操作:
character(){}
player(){}

但是,您可以(而且可能应该)使用初始值设定项列表语法初始化构造函数中的数据成员。例如,对于角色类,它将是:

character() : hp(100), name("Mario") { }
请注意,
}
后面不需要分号。或者您可以使用初始值设定项列表,并具有:

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

您需要做的是为默认构造函数
character::character()
player::player()
创建定义。虽然默认构造函数不接受参数,但仍然需要为它们提供定义。如果它们什么都不做,甚至不进行成员初始化,那么您可以简单地执行为析构函数所做的操作:
character(){}
player(){}

但是,您可以(而且可能应该)使用初始值设定项列表语法初始化构造函数中的数据成员。例如,对于角色类,它将是:

character() : hp(100), name("Mario") { }
请注意,
}
后面不需要分号。或者您可以使用初始值设定项列表,并具有:

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

请不要在头文件中使用命名空间执行
!即使是在玩具项目中也不行——只是不要养成这个习惯。谢谢你的评论John我以后会记住这一点,谢谢为什么级别和经验不是基类的成员?不要在函数定义的末尾放一个分号:
player::player(){…}int getHP(){return hp;}
int getHP(){return hp;}
就可以了。不过,你需要一些hp的法力:请不要在头文件中使用命名空间执行
!即使是在玩具项目中也不行——只是不要养成这个习惯。谢谢你的评论John我以后会记住这一点,谢谢为什么级别和经验不是基类的成员?不要在函数定义的末尾放一个分号:
player::player(){…}int getHP(){return hp;}
int getHP(){return hp;}
就可以了。你需要一些hp的魔法:锁定我的“character.h”或我的“main.cpp”?如果它有一个空构造函数“()”,为什么我需要定义它?我认为创建“character()”不需要参数?除非你使用的是仅标题库,否则我会将所有代码保存在代码文件中,并将所有文档和定义保存在标题文件中。您的角色构造函数可以接受任意数量的参数——这就是您的调用。但是,如果您定义了任何构造函数,编译器将不会免费为您提供一个。只需将代码的前五行复制到main.cpp文件中,就可以了——至少对于character类是这样。您也可以将所有类放在名称空间下,这是一种很好的做法。在我的“character.h”或“main.cpp”中?如果它有空构造函数“()”,为什么我需要定义它?我认为创建“character()”不需要参数?除非您使用的是仅标头的库,我会将所有代码保存在代码文件中,将所有文档和定义保存在头文件中。您的角色构造函数可以接受任意数量的参数——这就是您的调用。但是,如果您定义了任何构造函数,编译器将不会免费为您提供一个。只需将代码的前五行复制到main.cpp文件中,就可以了——至少对于character类是这样。您也可以将所有类放在一个名称空间下,这是一个很好的实践。