我只是想构建一个RPG并尽可能整洁,我希望定义一堆字符串,我可能想稍后编辑,所以我尝试过这样的事情:
enum { MSG_INIT = "Welcome to ...", MSG_FOO = "bar" };
但我只是得到错误,例如MSG_INIT
不是整数!为什么它不能是一个字符串,是什么枚举只适用于?
您认为定义一堆字符串的最佳方法是什么?在一个名为msg的结构中?我对这一切都不熟悉,所以我真的很感激小例子。
答案 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/