首页 > 解决方案 > 静态成员错误地初始化为空字符串

问题描述

我有三个文件:

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 读取值。它有一些成员,例如remoteHostport

为什么两个静态成员都是空的,我该如何解决?

标签: c++initializationstatic-members

解决方案


由于您没有提供最小、完整和可验证的示例,因此只能猜测会发生什么。

首先,类的静态数据成员在程序的最开始以未指定的顺序初始化,在main()被调用之前1。这意味着

string HttpApi::remoteHost = Config::getInstance().getRemoteServer();
string HttpApi::port = Config::getInstance().getPort();

之前被评估过

config.loadConfig("config.ini");

其次,如果我们假设在调用Config::getInstance()any 之前返回默认构造的实例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

静态数据成员的初始化和销毁​​与非局部变量 ( [basic.start.static], [basic.start.dynamic], [basic.start.term]) 完全相同。

[basic.start.dynamic]/4

具有静态存储持续时间的非局部非内联变量的动态初始化是在 main 的第一条语句之前排序还是延迟,这是实现定义的。


推荐阅读