D& D游戏的类,命名空间和继承有用

时间:2011-10-16 05:15:48

标签: c++ inheritance namespaces

因此,对于课程,我们必须制作D& D 3.5游戏,并且对于第一项任务,我必须生成战斗机角色。我在脑海中设置层次结构的方式是character.cpp,它的子类是classname.cpp,它有一些特定于类的属性,因为所有类共享相同的基本内容。

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

出现的另一个问题是,因为我的队友将为游戏制作一个GUI,他也可以创建一个名为character的类。我想解决这个问题我会创建一个命名空间。但是如果我使每个文件都在它们各自的头文件中的命名空间d20中的类,那么所有这些命名空间都是同一个吗?我想不出一个很好的方式来说出这个问题。

3 个答案:

答案 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.cppbarbarian.cpp等。

您可以使用像'rollstats'这样的受保护函数创建基类来返回包含统计信息的字符串。然后,子类可以使用公共rollstats函数覆盖它,该函数调用基类的方法,然后附加其他统计信息。

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