因此,对于课程,我们必须制作D& D 3.5游戏,并且对于第一项任务,我必须生成战斗机角色。我在脑海中设置层次结构的方式是character.cpp,它的子类是classname.cpp,它有一些特定于类的属性,因为所有类共享相同的基本内容。
这是一个很好的结构吗?如果相关,我们还没有完成STL。
出现的另一个问题是,因为我的队友将为游戏制作一个GUI,他也可以创建一个名为character的类。我想解决这个问题我会创建一个命名空间。但是如果我使每个文件都在它们各自的头文件中的命名空间d20中的类,那么所有这些命名空间都是同一个吗?我想不出一个很好的方式来说出这个问题。
答案 0 :(得分:4)
这是我最好的回答你......
良好的继承结构是特定于上下文的,但基本原则是基类包含与所有派生类相关的数据和函数。派生类将包含特定的数据和函数。在你的情况下,基类“角色”中会有很多数据,比如根据统计数据计算结果的所有角色统计数据和函数(我假设游戏规则通常与类无关)。
我也假设当你说'classname.cpp'你的意思是'fighter.cpp','cleric.cpp'等等。在这种情况下,是的,我同意将其结构化。
STL对提出类层次结构并没有直接的影响,所以我会说不,它没有相关性。
对于命名空间,无论何时指定命名空间,它都会与您指定完全相同名称的任何其他位置相同(这是我认为您要问的)。你不需要做任何特殊的事情来使它成为相同的命名空间,而不是命名它同样的东西。一个简单的例子如下:
character.h
namespace d20
{
class Character
{
Character();
~Character();
//etc...
}
}
character.cpp
#include "character.h"
namespace d20
{
Character::Character()
{
// Stuff...
}
Character::~Character()
{
}
}
fighter.h
#include "character.h"
namespace d20
{
class Fighter : public Character
{
Fighter ();
~Fighter ();
//etc...
}
}
OR(没有命名空间关键字)
#include "character.h"
class Fighter : public d20::Character
{
Fighter ();
~Fighter ();
//etc...
}
编辑:请注意,在第二种情况下,Fighter类不是名称空间d20,它只是从该名称空间中的类派生。
答案 1 :(得分:1)
对于你的情况,我建议反对继承,因为继承通常有两种使用方式:你总是使用基类,而不是upcast,或者使用继承。第一个不是你想要的,第二个可能有点棘手。 (也使得无法进行多分类)从长远来看,一个非常通用的character
类会让你更远。
namespace d20 {
enum classtype {warrior_class, cleric_class, rogue_class, mage_class};
class character {
classtype charclass;
int hp;
int bab;
int str;
string get_name();
void hit(character* enemy);
};
}
另一方面,如果这只是一个家庭作业,并且你想让事情变得非常简单,那么使用虚函数继承可能会使简单的程序更容易。
namespace d20 {
class character {
int hp;
int bab;
int str;
virtual string get_name() = 0;
virtual void hit(character* enemy) const;
};
}
namespace d20 {
class fighter {
string get_name() {return "Fighter";}
void hit(character* enemy);
}
}
答案 2 :(得分:0)
这听起来对我来说是一种合理的做法。据推测,classname.cpp
可以更好地命名为cleric.cpp
,barbarian.cpp
等。
您可以使用像'rollstats'这样的受保护函数创建基类来返回包含统计信息的字符串。然后,子类可以使用公共rollstats
函数覆盖它,该函数调用基类的方法,然后附加其他统计信息。
如果你的同学正在创建GUI,那么他应该使用你的课程吗?在这种情况下,他应该只是导入你的.h / .cpp文件,而且不必担心命名空间。