【问题标题】:What is a good idea for a list of strings?字符串列表的好主意是什么?
【发布时间】:2010-06-09 08:09:36
【问题描述】:

我只是想构建一个 RPG 并使其尽可能简洁,我希望定义一堆我以后可能想要编辑的字符串,所以我尝试了这样的事情:

enum { MSG_INIT = "Welcome to ...", MSG_FOO = "bar" };

但我只是得到错误,例如 MSG_INIT 不是整数!为什么它不能是一个字符串,这是枚举的唯一用途吗?

您认为定义一堆字符串的最佳方式是什么?在一个名为 msg 的结构中?我对这一切有点陌生,所以我非常感谢一些小例子。

【问题讨论】:

    标签: c++ string enums


    【解决方案1】:

    许多 RPG 不会将消息存储在 C++ 源文件中,而是存储在文本文件中,如下所示:

    1, Welcome...
    2, The $obj cannot be moved.
    3, Score is %d
    

    这些是在运行时加载的,而不是在编译时编译,然后通过它们的数字键访问,优点是您可以更改消息而无需重新编译游戏引擎。如果您想要这种结构,那么您可能需要像 std::map<int,std::string> 这样的东西来保存加载后的消息。

    【讨论】:

    • 我也会将它们存储在一个资源文件中,例如 .txt 文件,这样就可以在不重新编译代码的情况下进行更改。
    • @Cobusve 不幸的是,它也使其不可移植。
    • +1,另外我会使用std::map<std::string, std::string>,因为它提供了更大的灵活性,IMO,如果你想在游戏中支持脚本。
    【解决方案2】:

    如果您希望将它们分组,请使用命名空间。

    namespace Messages 
    {
        const string INIT = "Welcome to ...";
        const string BLAH = "Whiii!";
    };
    

    【讨论】:

      【解决方案3】:

      C++ 中的枚举具有整数值 - 它们将被枚举(所以 TUESDAY == MONDAY + 1),而不是成为不相关的一堆。

      你应该使用什么结构来存储你的字符串取决于你打算用它们做什么。如果您想根据值的组合使用不同的字符串,将它们放入映射或数组中可能比仅定义常量更合适。

      或者,如果您想在运行时更改字符串,您可以使用在启动时读取的单独文件 - 取决于您想要编辑它们的“稍后”是在编译代码之前还是之后。

      您也可以尝试更多地考虑将数据和操作一起保存在对象中,而不是拥有一个大的字符串集合。

      【讨论】:

        【解决方案4】:

        如果你想直接在软件中包含字符串,你可以使用extern关键字:

        // someHeader.h
        namespace messages
        {
          extern const std::string WelcomeOnBoard;                // declaration
        }
        
        // someHeader.cpp
        #include "myproject/someHeader.h"
        
        namespace messages
        {
          const std::string WelcomeOnBoard = "Welcome on Board!"; // definition
        }
        

        命名空间的主要优点是您可以将消息拆分为不同的文件,根据某些区域等对它们进行分组。

        但是,您通常不会那样做。

        软件中的编码字符串会导致维护和国际化问题。

        • 您希望删除逗号或更正错误?重新编译
        • 你想把游戏翻译成瑞典,因为你真正想打动的这个女孩的英文不是很好?哎哟……祝你好运。

        因此,您通常在软件中使用标识符,这些标识符通过框架映射到字符串。一个著名的此类框架是gettext

        这些消息被放入一个.po 文件中,并带有一个漂亮的 GUI 来编辑它们,并使用标识符来引用,这些标识符本身就是软件中的句子。例如:

        printf (gettext ("The amount is %0" PRId64 "\n"), number);
        

        GUI 包括搜索现有消息的方法,还包括模糊翻译功能。

        【讨论】:

          【解决方案5】:

          枚举用于您希望在内存中有效操作的相关数字常量组。

          相反,您可以只使用 C 字符串常量:

          char const *const MSG_INIT = "Welcome to ...";
          char const *const MSG_FOO = "bar";
          

          如果您愿意,可以将它们设为公共字段。

          例如

          struct SomeClass
          {
              static char const *const MSG_INIT;
              static char const *const MSG_FOO;
          };
          
          char const *const SomeClass::MSG_INIT = "Welcome to ...";
          char const *const SomeClass::MSG_FOO = "bar";
          

          【讨论】:

          • 我只是在考虑大型游戏,他们只是得到了充满字符串和东西的大文件,想知道我应该实现什么(因为我刚刚学习),命名空间看起来有点奇怪,但它们看起来会很好用。
          • 是的,它应该可以工作,类而不是命名空间,我会找个借口将东西添加到对象中,然后再处理它,谢谢。
          • 或使用struct { static const string BLA; },则可以保存public:修饰符
          • 这样的问题是大多数项目源文件中都需要这些消息,您最终会得到很多不必要的重复字符串值。如果您采用这种方法,我会使用 const char * const 值作为字符串,因为这样只会复制指针。
          • 你应该使用命名空间而不是类
          【解决方案6】:

          enums 是枚举数字的缩写,它们将名称附加到整数。您可以使用类对字符串进行分组。

          【讨论】:

          • 在将相关项目分组在一起时,更喜欢使用命名空间而不是类(除非您打算进行元编程)......这就是创建命名空间的目的!
          【解决方案7】:

          enum 用于定义enumerated type

          例如你可以有

          enum {CLUBS, DIAMONDS, HEARTS, SPADES};
          

          所以写 CLUBS 将与写 0 相同,DIAMONDS 将与 1 相同,依此类推。您还可以为枚举的每个成员分配特定的值。

          也就是说,要构建字符串列表,您可能需要使用相应的 C++ 类型,即 list <string>

          例如看 http://www.cplusplus.com/reference/stl/list/list/ http://www.cplusplus.com/reference/string/string/

          【讨论】:

          • 不,你绝对不想要list。它是不得已而为之的容器,仅对它的迭代器失效保证有用。
          • @Matthieu M.:所以list <string> 对存储字符串列表没有用处?
          • 这取决于您希望对其进行的操作。如果您不知道选择哪个容器,请选择deque,如果您需要唯一性,请使用setunordered_set,如果您需要C-Compatibility,请使用vectorlist 唯一感兴趣的是保证插入和删除不会使对已经存在的元素的引用无效。
          猜你喜欢
          • 2022-01-21
          • 1970-01-01
          • 2014-06-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-01
          • 2012-05-25
          • 2019-07-22
          相关资源
          最近更新 更多