【发布时间】:2012-04-29 10:06:36
【问题描述】:
我正在编写一个 Cocos2D-X 游戏,其中玩家、敌人和其他角色将他们的属性存储在 CCMutableDictionary 中,这在某种程度上是 std::map<std::string, CCObject*> 的装饰器类。可以通过CCMutableDictionary::objectForKey(const std::string& key) 方法访问字典中的值。
现在,在我的许多 .cpp 文件包含的头文件中,我有一些 const char * const 字符串用于访问字典中的值,如下所示:
// in Constants.h
const char* const kAttributeX = "x";
const char* const kAttributeY = "y";
// in a .cpp file
CCObject* x = someDictionary->objectForKey(kAttributeX);
所以,如果我错了,请纠正我,但是每次我使用 @987654329 调用上述 objectForKey 方法之一时,正在调用 std::string 的复制构造函数并且临时的 std::string 在堆栈上@,对吧?
如果是这样,我觉得如果那些常量属性键已经是std::string 对象,在运行时会更有效。但是我该如何以正确的方式做到这一点?
像下面这样在 Constants.h 文件中定义它们可以很好地编译,但我觉得有些地方不对:
// in Constants.h
const std::string kAttributeX = "x";
const std::string kAttributeY = "y";
如果这个问题已经被问到,我深表歉意。我似乎无法在 StackOverflow 上找到我正在寻找的确切答案。
【问题讨论】:
-
在将 'const char* const' 替换为 'const std::string' 时要小心。静态对象的初始化顺序是未定义的,因此如果您在实际初始化自身之前使用 const 字符串初始化其他静态/常量对象,它可能会产生非常不愉快的后果。这不是 const char* const 的问题,它保证在任何执行开始之前就存在。这种情况也是调试的噩梦,因为代码看起来是正确的。
标签: c++ static constants stdstring