C++ D&;类、名称空间和继承帮助;D游戏

C++ D&;类、名称空间和继承帮助;D游戏,c++,inheritance,namespaces,C++,Inheritance,Namespaces,所以在课堂上我们要做一个D&D3.5游戏,在第一个任务中我要生成一个战士角色。我在头脑中建立层次结构的方式是character.cpp,它的子级是classname.cpp,其中它有一些特定于类的属性,因为所有类共享相同的基本内容 这是一个很好的结构吗?如果是相关的,我们还没有做STL 出现的另一个问题是,由于我的队友将为游戏制作GUI,他可能还会制作一个名为character的类。我认为要解决这个问题,我需要创建一个名称空间。但是,如果我让我创建的每个文件在各自的头文件中的名称空间d20中都有

所以在课堂上我们要做一个D&D3.5游戏,在第一个任务中我要生成一个战士角色。我在头脑中建立层次结构的方式是character.cpp,它的子级是classname.cpp,其中它有一些特定于类的属性,因为所有类共享相同的基本内容

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


出现的另一个问题是,由于我的队友将为游戏制作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);
    }
}