【发布时间】:2018-05-09 14:58:21
【问题描述】:
我有三个文件:
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 是一个单例类,它从config.ini 中读取值。它有一些成员,例如remoteHost和port。
为什么两个静态成员都是空的,我该如何解决?
【问题讨论】:
-
Static Initialization Order Fiasco,也许?您还没有显示
Config的代码。 -
HttpApi::remoteHost和HttpApi::port的初始化可能发生得太早,那时Config::getInstance().getRemoteServer()会因任何原因返回并为空字符串。先检查一下。 -
静态成员对象的初始化很大程度上取决于整个事物的编译方式。标准说的第一件事是:静态成员按其定义的顺序进行初始化,而不是按声明的顺序初始化。标准规定的第二件事是:静态初始化可以在第一次使用类的任何对象或函数之前发生。
-
这可能会有所帮助:stackoverflow.com/a/1008289/3807729
标签: c++ initialization static-members