静态成员错误地初始化为空字符串
Static members erroneously initialized as empty strings
我有三个文件:
api.h
:
class HttpApi{
public:
static bool postData(string json);
private:
static string remoteHost;
static string port;
static string url;
};
api.cpp
:
string HttpApi::remoteHost = Config::getInstance().getRemoteServer();
string HttpApi::port = Config::getInstance().getPort();
string HttpApi::url="/api/miner";
bool HttpApi::postData(string json)
{
//Here I print Config::getInstance.getRemoteServer(), the value is correct set here
cout<<"Start resolve "<< remoteHost<<" "<<port<<endl;
cout<<"Succeed in resolving "<<endl;
}
最后:
int main(int argc, char** argv)
{
Config& config = Config::getInstance();
cout<<"Start loading configuration "<<endl;
config.loadConfig("config.ini");
HttpApi::postData("hello world");
}
我的问题是两个成员 remoteHost
、port
的初始化无效:在运行时,两者都是空的。
这里 Config
是一个单例 class,它从 config.ini 中读取值。它有一些成员,例如 remoteHost
和 port
.
为什么两个静态成员都是空的,我该如何解决?
由于您没有提供 Minimal, Complete, and Verifiable example,所以只能猜测会发生什么。
首先,类 的静态数据成员在程序的最开始以未指定的顺序初始化,在 main()
被调用之前1 .这意味着
string HttpApi::remoteHost = Config::getInstance().getRemoteServer();
string HttpApi::port = Config::getInstance().getPort();
在
之前评估
config.loadConfig("config.ini");
其次,如果我们假设 Config::getInstance()
returns 在调用任何 loadConfig
之前是一个默认构造的实例,并且如果我们还假设一个默认构造的 Config
只是空字符串的集合,那么我们可以肯定地说 HttpApi::remoteHost
和 HttpApi::port
将从空字符串初始化。
最后,一个可能的解决方案是放弃反模式 Singleton is,或者为 HttpApi
定义一种使用已加载配置的方法:
void HttpApi::load(Config const& conf) // obviously declared as static
{
remoteHost = conf.getRemoteServer();
port = conf.getPort();
}
int main(int argc, char** argv)
{
Config& config = Config::getInstance();
std::cout << "Start loading configuration\n";
config.loadConfig("config.ini");
HttpApi::load(config);
HttpApi::postData("hello world");
}
1) 这不完全正确,对于好奇的读者:
[class.static.data]/6
Static data members are initialized and destroyed exactly like non-local variables ([basic.start.static]
, [basic.start.dynamic]
, [basic.start.term]
).
和
[basic.start.dynamic]/4
It is implementation-defined whether the dynamic initialization of a non-local non-inline variable with static storage duration is sequenced before the first statement of main or is deferred.
我有三个文件:
api.h
:
class HttpApi{
public:
static bool postData(string json);
private:
static string remoteHost;
static string port;
static string url;
};
api.cpp
:
string HttpApi::remoteHost = Config::getInstance().getRemoteServer();
string HttpApi::port = Config::getInstance().getPort();
string HttpApi::url="/api/miner";
bool HttpApi::postData(string json)
{
//Here I print Config::getInstance.getRemoteServer(), the value is correct set here
cout<<"Start resolve "<< remoteHost<<" "<<port<<endl;
cout<<"Succeed in resolving "<<endl;
}
最后:
int main(int argc, char** argv)
{
Config& config = Config::getInstance();
cout<<"Start loading configuration "<<endl;
config.loadConfig("config.ini");
HttpApi::postData("hello world");
}
我的问题是两个成员 remoteHost
、port
的初始化无效:在运行时,两者都是空的。
这里 Config
是一个单例 class,它从 config.ini 中读取值。它有一些成员,例如 remoteHost
和 port
.
为什么两个静态成员都是空的,我该如何解决?
由于您没有提供 Minimal, Complete, and Verifiable example,所以只能猜测会发生什么。
首先,类 的静态数据成员在程序的最开始以未指定的顺序初始化,在 main()
被调用之前1 .这意味着
string HttpApi::remoteHost = Config::getInstance().getRemoteServer();
string HttpApi::port = Config::getInstance().getPort();
在
之前评估config.loadConfig("config.ini");
其次,如果我们假设 Config::getInstance()
returns 在调用任何 loadConfig
之前是一个默认构造的实例,并且如果我们还假设一个默认构造的 Config
只是空字符串的集合,那么我们可以肯定地说 HttpApi::remoteHost
和 HttpApi::port
将从空字符串初始化。
最后,一个可能的解决方案是放弃反模式 Singleton is,或者为 HttpApi
定义一种使用已加载配置的方法:
void HttpApi::load(Config const& conf) // obviously declared as static
{
remoteHost = conf.getRemoteServer();
port = conf.getPort();
}
int main(int argc, char** argv)
{
Config& config = Config::getInstance();
std::cout << "Start loading configuration\n";
config.loadConfig("config.ini");
HttpApi::load(config);
HttpApi::postData("hello world");
}
1) 这不完全正确,对于好奇的读者:
[class.static.data]/6
Static data members are initialized and destroyed exactly like non-local variables (
[basic.start.static]
,[basic.start.dynamic]
,[basic.start.term]
).
和
[basic.start.dynamic]/4
It is implementation-defined whether the dynamic initialization of a non-local non-inline variable with static storage duration is sequenced before the first statement of main or is deferred.