【问题标题】:Classes, namespaces and inheritance help for D&D gameD&D 游戏的类、命名空间和继承帮助
【发布时间】:2011-10-16 05:15:48
【问题描述】:

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

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

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

【问题讨论】:

  • 这是无法回答的。如果您发布您的尝试并解释您在当前设计中遇到的问题,将会有所帮助。
  • “所以为了上课,我们必须制作一个 D&D 3.5 游戏” 你的学校实际上布置了类似的作业?执行 D&D 3.5 规则?而且您甚至还没有接触过 STL,即使您的团队成员之一已经在做 GUI 工作?现在我明白为什么这么多 C++ 程序员的成绩这么差了。
  • 好吧,我想我没有说清楚,我的任务是滚动一个角色并显示统计数据。任务的另一部分是制作地图并在其上放置一些东西,并能够从文件中加载地图。另外,是的,班级非常混乱。
  • 另外,我们正在制作 3.5 规则集的超级基本版本。
  • @Portaljacker 滚动是什么意思?掷骰子?您是否将其显示到控制台?地图是什么意思?

标签: c++ inheritance namespaces


【解决方案1】:

这是我最好的回答你...

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

我还假设当您说“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()
    {
    }
}

战斗机.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,它只是派生自该命名空间中的类。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这听起来对我来说是一个合理的方法。大概classname.cpps 最好命名为cleric.cppbarbarian.cpp 等。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-10
        • 1970-01-01
        • 1970-01-01
        • 2021-10-18
        • 2020-10-21
        • 2013-03-10
        • 2011-08-18
        • 2015-07-18
        相关资源
        最近更新 更多