D&D 游戏的类、命名空间和继承帮助

Classes, namespaces and inheritance help for D&D game

本文关键字:继承 帮助 命名空间 游戏      更新时间:2023-10-16

所以对于课程,我们必须制作一个d&&d 3.5游戏,对于第一个任务,我必须生成一个战士角色。我在脑海中建立层次结构的方式是character.cpp,它的子类是classname.cpp,其中它具有特定于类的一些属性,因为所有类共享相同的基本内容。

这是一个好的结构吗?如果是相关的,我们还没有做STL。

出现的另一个问题是,由于我的队友将为游戏制作GUI,他可能也会制作一个名为"角色"的职业。为了解决这个问题,我想创建一个名称空间。但如果我让我制作的每个文件在各自的头文件名称空间d20中都有它们的类,那么所有这些名称空间会是相同的吗?我想不出一个很好的方式来表达这个问题。

这是我最好的回答。

一个好的继承结构是非常特定于上下文的,但基本原则是基类包含与所有派生类相关的数据和函数。派生类将包含自身的特定数据和函数。在你的情况下,在基类"角色"中会有很多数据,比如所有的角色属性和基于属性计算结果的函数(我假设游戏规则通常是独立于类别的)。

我还假设当你说"classname.cpp"时,你的意思是"fighter.cpp"、"clergy .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...
}

编辑:请注意,在第二种情况下,战斗机类不是名称空间d20,它只是派生自该名称空间中的一个类。

对于您的情况,我建议使用而不是继承,因为继承通常有两种使用方式:总是使用基类,从不向上转换,或者使用继承。第一个不是你想要的,第二个可能有点棘手。从长远来看,一个非常通用的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);
    }
}

对我来说这听起来是个合理的方法。可能classname.cpp s最好被命名为cleric.cpp, barbarian.cpp等。

你可以让你的基类有一个受保护的函数,比如'rollstats'来返回一个包含stats的字符串。然后,子类可以使用调用基类方法的公共rollstats函数覆盖它,然后附加额外的统计信息。

如果你的同学正在创建GUI,他应该使用你的类,不是吗?在这种情况下,他应该只导入您的。h/.cpp文件,而不必担心名称空间。