在C ++命名空间中存储大量消息

时间:2016-09-25 17:52:19

标签: c++ namespaces

我有一个小程序,基本上向用户提示问题,阅读答案,检查其有效性等等,直到完全执行RPG角色的创建。我迅速得到了几个课程,每个课程都与一堆要存储的信息有关。

我的问题是:存储这些消息的最佳方式是什么?

我的第一个(也是肮脏的)尝试是使用单个文件messages.hpp:

namespace M
{
   string const message1("what's your name ?");
   // + many others
}

但由于许多类依赖于此文件,因此对其进行的任何微小更改都意味着编译时间非常长。

因此,为了重新分发消息,我想将相关消息作为需要它们的类的静态成员包含在内,但我发现它破坏了我的类头的可读性。所以我在徘徊:我可以在类中创建一个子名称空间,它将是一个像这样的消息收集器:

// monster.h
class Monster
{
// members and methods declared here
};

namespace Monster::Messages
{
    string const message1("what's your name ?");
    // + others messages only used by Monster
}

并且可能像这样使用:

// monster.cpp
Monster::Monster()
{
   cout << Messages::message1 << endl;
}

然而,我想知道:

  • 是否会为Monster::messages的每个实例复制Monster的所有邮件?
  • 是否会将Monster::messages的所有邮件复制到所有文件中,包括monster.hpp(静态链接)?
  • Monster中的消息是否被视为成员,静态成员或非成员?
  • 如果我在Monster :: messages中使用static关键字,会发生什么情况 它具有静态链接或静态成员的意义吗?

当然:这是不好的做法吗?有巧妙的方法吗?

1 个答案:

答案 0 :(得分:4)

在我看来,最佳做法是将所有这些数据信息存储在游戏的外部数据文件中。

我将为您提供这样做的一些好处:

  • 代码更清晰明亮。

  • 即使不编译二进制文件,也可以实现对数据游戏的少量修改。这对于那些必须进行测试的数据参数非常重要,每次更改值时,您必须运行游戏以查看所有副作用。 (例如关于怪物健康,伤害,GUI位置等的一些参数......)。通过这种方式,测试阶段不需要再次编译二进制文件,而且速度更快。

  • 允许其他游戏开发者轻松修改游戏参数。例如,团队中那些不是程序员的人。

  • 允许轻松修改游戏数据而无需更改代码中的设计。例如,假设两年后你的游戏变得非常受欢迎,并且你想用多种语言翻译它以获得更多用户。如果所有这些数据都嵌入到代码中,您应该重新设计和修改代码,也许更重要的是,能够完成这项工作的人只有您,因为只有您拥有访问权限和代码知识。在另一种情况下(当数据存储在外部文件中时),更多人可以轻松访问和升级您的游戏。

如何实现这一程序可能是SO的另一个问题,但有几种选择。

例如,您可以创建一个独特的巨大文件(这意味着一些智能技巧,特别是出于性能原因),或者您可以将数据参数分发到多个文件中。 因此,您的游戏将具有加载的阶段,其中从磁盘读取数据(几乎所有其他游戏)。

此外,您应该考虑(如果需要)一种方法来加密这些文件并避免游戏用户修改它们。