Поскольку вы не предоставили Минимальный, Полный и Проверяемый пример , можно только догадываться, что произойдет.
Во-первых, статические данные-члены классов инициализируются в самом начале вашей программы, в неуказанном порядке, до того, как main()
вызывается 1 . Это означает, что
string HttpApi::remoteHost = Config::getInstance().getRemoteServer();
string HttpApi::port = Config::getInstance().getPort();
оценивается до
config.loadConfig("config.ini");
Во-вторых, если мы сделаем предположение, что Config::getInstance()
возвращает построенный экземпляр по умолчанию до вызова любого loadConfig
, и если мы также предположим, что построенный по умолчанию Config
является только набором, скажем, пустых строк, то мы можем точно сказать, что HttpApi::remoteHost
и HttpApi::port
будут инициализированы из пустых строк.
Наконец, возможное решение - удалить анти-шаблон Singleton или определить способ 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) Это не совсем так, для любопытных читателей:
Статические члены данных инициализируются и уничтожаются точно так же, как нелокальные переменные ([basic.start.static]
, [basic.start.dynamic]
, [basic.start.term]
).
и
Определяется реализацией, выполняется ли динамическая инициализация нелокальной не встроенной переменной со статической длительностью хранения перед первым оператором main или откладывается.