C++ D&;类、名称空间和继承帮助;D游戏
所以在课堂上我们要做一个D&D3.5游戏,在第一个任务中我要生成一个战士角色。我在头脑中建立层次结构的方式是character.cpp,它的子级是classname.cpp,其中它有一些特定于类的属性,因为所有类共享相同的基本内容 这是一个很好的结构吗?如果是相关的,我们还没有做STLC++ D&;类、名称空间和继承帮助;D游戏,c++,inheritance,namespaces,C++,Inheritance,Namespaces,所以在课堂上我们要做一个D&D3.5游戏,在第一个任务中我要生成一个战士角色。我在头脑中建立层次结构的方式是character.cpp,它的子级是classname.cpp,其中它有一些特定于类的属性,因为所有类共享相同的基本内容 这是一个很好的结构吗?如果是相关的,我们还没有做STL 出现的另一个问题是,由于我的队友将为游戏制作GUI,他可能还会制作一个名为character的类。我认为要解决这个问题,我需要创建一个名称空间。但是,如果我让我创建的每个文件在各自的头文件中的名称空间d20中都有
出现的另一个问题是,由于我的队友将为游戏制作GUI,他可能还会制作一个名为character的类。我认为要解决这个问题,我需要创建一个名称空间。但是,如果我让我创建的每个文件在各自的头文件中的名称空间d20中都有它们的类,那么所有这些名称空间都是相同的吗?我想不出一个很好的方式来表达这个问题。这是我回答你的最好办法 一个好的继承结构是非常特定于上下文的,但基本原则是基类包含与所有派生类相关的数据和函数。派生类本身将包含特定的数据和函数。在您的例子中,基类“character”中会有很多数据,就像所有基于stats计算结果的角色统计和函数一样(我假设游戏规则通常与类无关) 我还假设,当你说'classname.cpp'时,你的意思是'fighter.cpp','cleric.cpp',等等。在这种情况下,是的,我同意这样构造它 STL对类层次结构的提出并没有直接影响,所以我会说不,它不相关 至于名称空间,无论何时指定名称空间,它都将与指定完全相同的名称的任何其他地方相同(我想这是您要问的)。您不需要做任何特殊的事情来将它命名为相同的名称空间,而只需要将它命名为相同的东西。一个简单的例子如下: 字符.h character.cpp 战斗机 或(不带名称空间关键字)
编辑:请注意,在第二种情况下,Fighter类不是名称空间d20,它只是从该名称空间中的一个类派生而来。我觉得这是一种合理的方法。大概
classname.cpp
s的名字应该更像cleric.cpp
,barbarian.cpp
等
您可以使用受保护的函数(如“rollstats”)创建基类,以返回包含stats的字符串。然后,子类可以使用一个公共的rollstats
函数来覆盖它,该函数调用基类的方法,然后附加额外的stats
如果你的同学正在创建GUI,他应该在使用你的类,不是吗?在这种情况下,他应该只导入您的.h/.cpp文件,而不必担心名称空间。对于您的情况,我建议不要使用继承,因为继承通常有两种使用方式:始终使用基类,从不向上转换,或者使用继承。第一个不是你想要的,第二个可能有点棘手。(也使多重分类变得不可能)从长远来看,一个非常通用的
字符类会让你走得更远
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);
}
}
这是不负责任的。如果你把你尝试过的东西贴出来,并解释一下你目前的设计中存在的问题,这会有所帮助。“那么,在课堂上,我们必须制作一个D&D 3.5游戏”你的学校实际上分配了类似的作业?实施D&D 3.5规则?你甚至还没有接触到STL,即使你的一个团队成员已经在做GUI工作了?现在我明白为什么这么多C++程序员会出问题了。好吧,我想我没说清楚,我的任务是滚动一个字符并显示统计信息。作业的另一部分是制作地图并在上面放置一些东西,并且能够从文件加载地图。另外,是的,这个类是超级无组织的。我们正在制作一个3.5规则集的超级基本版本。@Portaljacker roll是什么意思?掷骰子?您正在将其显示到控制台吗?你说的地图是什么意思?
#include "character.h"
namespace d20
{
class Fighter : public Character
{
Fighter ();
~Fighter ();
//etc...
}
}
#include "character.h"
class Fighter : public d20::Character
{
Fighter ();
~Fighter ();
//etc...
}
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);
}
}