繁体   English   中英

在头文件中执行const std :: string的正确方法?

[英]Proper way to do const std::string in a header file?

我正在写一个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);

所以,如果我错了,请纠正我,但是每当我使用const char* const调用上述objectForKey方法之一时, std::string的复制构造函数被调用并且栈上有临时的std::string ,对?

如果是这样,我觉得如果那些常量属性键已经是std::string对象,那么它在运行时会更有效。 但是我该如何以正确的方式做到这一点?

在Constants.h文件中定义它们,如下所示编译好,但我觉得有些事情是不对的:

// in Constants.h
const std::string kAttributeX = "x";
const std::string kAttributeY = "y";

如果已经提出这个问题我很抱歉。 我似乎找不到我在StackOverflow上寻找的确切答案。

你写的代码是完全没有问题的,至少你只#includeConstants.h只有一个源文件的文件。 如果在多个源文件中使用头文件,则将多次定义相同的变量。 正确的使用头文件中的常量是他们分成头( Constants.h ),其中包含变量的声明 ,和一个源文件( Constants.cpp其中包含变量的定义 ):

头文件:

#ifndef CONSTANTS_H
#define CONSTANTS_H

extern const std::string kAttributeX;
extern const std::string kAttributeY;

#endif

源文件:

const std::string kAttributeX = "x";
const std::string kAttributeY = "y";

您的第二个选项会导致在每个翻译单元(包含标题的cpp文件)中创建每个变量,这将略微增加代码大小以及添加一些运行时成本(在启动期间构造所有这些字符串并在处理过程中对其进行破坏)终止)。

Joachim建议的解决方案有效,但我发现单独声明和定义变量有点拖累。 我个人讨厌重复自己,也不喜欢一遍又一遍地说同样的话......

我不知道在C ++中有一个很好的解决方案,但是我使用的编译器都支持像__declspec( selectany )这样的东西,这样你就可以在头文件中定义变量,只获得一个实例化的对象(而不是每个翻译单位一个)。

__declspec( selectany ) extern const std::string kAttributeX = "x";

(为什么externconst看到这个答案 )。

您仍然有在流程启动期间支付所有全局变量的初始化价格的缺点。 这可以在101%的时间内接受(给出或取2%)但你可以通过使用惰性对象来避免这种情况(我在这里写过类似的东西 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM