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

Storing lots of messages in C++ namespace

本文关键字:消息 存储 c++ 命名空间      更新时间:2023-10-16

我有一个小程序,它基本上向用户提示问题,阅读答案,检查其有效性,等等,直到完全完成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关键字会发生什么它具有静态链接或静态成员的含义?

当然:这是不好的做法吗?有没有聪明的办法?

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

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

  • 代码更清晰、简洁。

  • 即使不编译二进制文件,也可以对数据游戏进行少量修改。这对于那些需要测试的数据参数非常重要,每次你改变数值时,你都必须运行游戏以查看所有副作用。(例如怪物生命值、伤害、GUI位置等参数)。这样,测试阶段就不需要再次编译二进制文件,而且速度更快。

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

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


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

例如,您可以创建一个唯一的大文件(这意味着一些聪明的技巧,特别是出于性能原因),或者您可以将数据参数分布在几个文件中。所以你的游戏将有一个加载的阶段,在这个阶段中数据将从磁盘读取(就像其他所有游戏一样)。

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