c++ - 静态成员错误地初始化为空字符串
问题描述
我有三个文件:
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
。
为什么两个静态成员都是空的,我该如何解决?
解决方案
由于您没有提供最小、完整和可验证的示例,因此只能猜测会发生什么。
首先,类的静态数据成员在程序的最开始以未指定的顺序初始化,在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 的第一条语句之前排序还是延迟,这是实现定义的。
推荐阅读
- python - YouTube-DL Python 输出文件格式不是 mp4
- oracle - 我正在尝试移动一些行并将它们转换为列
- java - 使用 Tableau Server 生成备份时出错
- bash - 如何根据音频长度批量自动生成视频
- python - 在 Python 中对具有相似名称的列进行分组
- woocommerce - WooCommerce 最近的产品分页限制总体和每页
- spring-boot - 在 Spring Boot 中运行测试时,Liquibase 没有从 test/resources 目录中获取变更集
- android - 如何在 Flutter WebView 或 InAppWebView 中添加 JavaScriptInterface?
- snowflake-cloud-data-platform - 时间戳减少 1000 倍
- menu - LocalStorage - 单独选择