在c ++

时间:2018-05-06 21:07:09

标签: c++ c++11

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

我将配置类(.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;

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

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

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

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

你以前见过吗?我在这里缺少什么?

由于 莫罗

1 个答案:

答案 0 :(得分:0)

这似乎是一个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进行测试。

编辑自包含的示例是:

#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的错误,使用静态地图时你的代码不会有任何问题。

如果这种情况没有错误,那就是一个问题。