【问题标题】:Weird issue using static map in c++在 C++ 中使用静态映射的奇怪问题
【发布时间】:2018-05-08 16:28:44
【问题描述】:

我有一个问题,我不明白为什么会这样。简而言之,我想创建一个单例来读取配置文件,其中每个属性都将存储在地图中。

我将我的配置类 (.h) 定义为

class Configuration {
public:
    static Configuration* getInstance(std::string configFile);

private:
    static std::map<std::string, std::string> properties;
    static bool instanceFlag;
    static Configuration *instance;

    Configuration();
    Configuration(std::string configFile);
    ~Configuration();
};

在实现类上我有以下内容:

#include <iostream>
#include <fstream>

#include "Configuration.h"

std::map<std::string, std::string> Configuration::properties {};
bool Configuration::instanceFlag = false;
Configuration *Configuration::instance = NULL;

问题是,我的变量属性是配置类型而不是地图。如果将键和值替换为 int,则属性将变为映射。看起来很奇怪。

我在头文件中包含了字符串。

没有异常或错误。我的意思是,编译运行良好而不是错误。但是,我的地图总是空的。在eclipse上调试我注意到变量属性的类型是Configuration而不是map。

当我将键值类型从string更改为int时,对象属性的类型是map。

你以前见过吗?我在这里错过了什么?

谢谢 毛罗

【问题讨论】:

  • 您能详细说明一下吗?您是否收到任何构建错误或警告?您能否编辑您的问题以包含它们(完整、完整、未修改并复制粘贴为文本)?
  • 顺便说一句,你确实在某处包含&lt;string&gt;
  • 不是您的问题,但可以省去一些麻烦并使用静态本地。并且不要将指针用于不能为空的东西,使用指针。并重新考虑这应该是单例,还是全局。
  • @NirFriedman “不要使用指针,使用指针”?
  • 显然是指引用,一个奇怪的大脑放屁我也很奇怪。

标签: c++ c++11


【解决方案1】:

这似乎是一个 gdb 错误,而不是您的编译器或代码的问题。

在 gdb 上,我可以评估以下内容:

ptype Configuration::properties.instanceFlag

它返回type = bool。 gdb 确实将您的 properties 解释为 Configuration 类型。

但如果将private: 更改为public: 并将Configuration::properties.instanceFlag = true 行放在main() 上,g++ 会发出以下错误:

test.cpp: In function ‘int main()’:
test.cpp:26:28: error: ‘class std::map<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >’ has no member named ‘instanceFlag’
  Configuration::properties.instanceFlag = true;

表示您的编译器理解得很好。在ubuntu下用g++-5.4.0和gdb-7.11.1测试过。

EDIT独立的例子是:

#include <map>
#include <string>

struct Configuration {
    static std::map<std::string, std::string> properties;
    static bool instanceFlag;
};

std::map<std::string, std::string> Configuration::properties {};
bool Configuration::instanceFlag = false;

int main(void)
{
    Configuration::properties.instanceFlag = true;
    return 0;
}

假设文件名为 mytest.cpp,如果你用g++ mytest.cpp -std=c++11 编译它,它应该会发出以下错误。

mytest.cpp: In function ‘int main()’:
mytest.cpp:14:28: error: ‘class std::map<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >’ has no member named ‘instanceFlag’
  Configuration::properties.instanceFlag = true;

如果您看到上述错误,则表示您很好。这只是gdb的bug,你的代码使用静态地图不会有任何问题。

如果编译没有错误,那就是问题。

【讨论】:

  • 我的版本是:g++ 7.2.0 和 gdb 8.0.1。也使用 ubuntu
  • @MauroSilva 当您添加Configuration::properties.instanceFlag = true 时,您的 g++ 不会发出等效的错误消息吗?
  • 如果我将 Configuration::properties.instanceFlag 的值设置为 true,则对象属性不会被实例化。
  • @MauroSilva 在 gdb 或 g++ 上?请参阅我的答案的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 2012-05-14
  • 2014-08-29
相关资源
最近更新 更多