对于字符串列表有什么好主意?

时间:2010-06-09 08:09:36

标签: c++ string enums

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

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

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

您认为定义一堆字符串的最佳方法是什么?在一个名为msg的结构中?我对这一切都不熟悉,所以我真的很感激小例子。

7 个答案:

答案 0 :(得分:14)

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

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:1)

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

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

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

您还可以尝试更多地考虑将数据和操作保存在对象中,而不是使用大型字符串集合。

答案 3 :(得分:1)

如果您希望直接在软件中包含字符串,则可以使用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包括搜索现有消息的方法,还包括模糊翻译功能。

答案 4 :(得分:0)

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

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

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

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

E.g。

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";

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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/