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

Nat*_*iss 12 c++ static const stdstring

我正在写一个Cocos2D-X游戏,其中玩家,敌人和其他角色将他们的属性存储在a中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);
Run Code Online (Sandbox Code Playgroud)

所以,如果我错了,请纠正我,但每当我使用a 调用上述方法之一时,std::string正在调用复制构造函数并且临时std::string存在于堆栈中,对吧?objectForKeyconst char* const

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

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

// in Constants.h
const std::string kAttributeX = "x";
const std::string kAttributeY = "y";
Run Code Online (Sandbox Code Playgroud)

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

Som*_*ude 24

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

头文件:

#ifndef CONSTANTS_H
#define CONSTANTS_H

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

#endif
Run Code Online (Sandbox Code Playgroud)

源文件:

const std::string kAttributeX = "x";
const std::string kAttributeY = "y";
Run Code Online (Sandbox Code Playgroud)

  • 您还可以在标头中使用“static const std::string kAttributeX = "x";”。那么您就不需要在源文件中实例化这些常量。#include 标头的每个编译单元都会获得自己的常量对象副本,但由于它在外部不可见,因此不会出现任何重复符号错误。 (2认同)
  • @CarolineBeltran `constexpr char*` 意味着 *pointer* 是一个 `constexpr` 但不是它所指向的内容。在 C++ 中,所有字符串文字都是*常量*字符数组,因此您必须有一个指向 `const` 数据的指针(如 `char const*`,又名 `const char*`,或者如果您希望指针是常量)以及“char const* const”)。 (2认同)