在c++命名空间中存储大量消息
Storing lots of messages in C++ namespace
我有一个小程序,它基本上向用户提示问题,阅读答案,检查其有效性,等等,直到完全完成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的另一个问题,但有几个选择。
例如,您可以创建一个唯一的大文件(这意味着一些聪明的技巧,特别是出于性能原因),或者您可以将数据参数分布在几个文件中。所以你的游戏将有一个加载的阶段,在这个阶段中数据将从磁盘读取(就像其他所有游戏一样)。此外,你应该考虑(如果你需要的话)一种方法来加密这些文件,避免游戏用户修改它们。
- 将字符串存储在c++中的稳定内存中
- boost::进程间消息队列引发错误
- std::原子加载和存储都需要吗
- C++:将控制台输出存储在宏中更好吗
- 在线编译器中的分段C++没有打印消息
- C++错误消息*成员参考.**初学者*
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 使用QProcess执行命令,并将结果存储在QStringList中
- 访问存储在向量C++中的结构的多态成员
- 如何从存储在std::映射中的std::集中删除元素
- 代码将向量存储为向量<vector>,为什么没有错误消息?
- 将二进制数据缓冲区存储在协议缓冲区消息中
- 如何在 C++ 中存储长十六进制值消息
- 是否有任何方法可以将 Dbgprint () 消息存储到文件中
- asio:存储要广播的消息的最佳方式
- 在c++命名空间中存储大量消息
- 使用Win32 API列出存储在资源专用库(DLL)中的消息id和符号名称
- 我如何重载序列化boost函数,使其一个用于文件存储,另一个用于tcp消息
- 将用于串行通信的消息存储为c++可行的成员变量
- 将多个消息存储在一个协议缓冲区二进制文件中