我遇到了一个常量静态字符串类成员的初始化顺序问题。有些代码:如何确保const静态成员的初始化顺序?
constants.h
class Constants
{
public:
// not used right now
Constants& getInstance();
const static std::string CONST_STRING;
};
constants.cpp
const std::string Constants::CONST_STRING = "my string";
Constants& Constants::getInstance();
{
static Constants c;
return c;
}
这是经典的常量静态初始化(忽略getInstance
)。但是,如果我再尝试另一种翻译单位的其他地方使用该常数是这样的:
class OtherClass
{
public:
OtherClass()
{
// tried uncommenting next line
// Constants::getInstance();
std::string str(Constants::CONST_STRING);
std::cout << str;
}
}
OtherClass obj; // note global
的CONST_STRING
是空的,即它已建成但尚未初始化。我知道整个初始化顺序不是跨翻译单元定义的,而且我猜这样的东西在这里适用?
但是,删除注释掉的行,试图确保常量是完全构造之前使用(我不相信这是必要的,但给它一个去......)仍然不能解决的问题。
问题:
- 我如何能确保在任何人尝试使用它们常量静态成员完全初始化?
- 这是最好的C + + 11的方法有一个类与常量关联?是
constexpr
东西可以在这里使用?
您的常量似乎实现Singleton模式 - 你为什么不使字符串通过访问单身人士?即让你的字符串成为一个成员并在单例的构造函数中初始化它。 – BeyelerStudios 2014-12-02 17:32:16
有关静态初始化命令失败的信息,请参阅[此C++ FAQ条目](http://www.parashift.com/c++-faq/static-init-order-on-first-use.html)。 – cdhowie 2014-12-02 17:34:32
'getInstance()'对'CONST_STRING'的初始化没有影响。 'constexpr'不是一个选项,因为'basic_string'构造函数不是'constexpr'。如果你想确保一个特定的顺序,你可以使'CONST_STRING'函数返回一个'const&'到一个函数local'static std :: string'。 – Praetorian 2014-12-02 17:34:46