Странная проблема с использованием статической карты в C ++ - PullRequest
0 голосов
/ 07 мая 2018

У меня есть проблема, я не понимаю, почему это происходит. В двух словах, я хотел бы создать синглтон для чтения файла конфигурации, в котором каждое свойство будет храниться на карте.

Я определил свой класс конфигурации (.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 Я заметил, что тип переменных - «Конфигурация», а не «Карта».

Когда я меняю ключ и тип значения со строки на int, тип свойств объекта - map.

Вы видели это раньше? Что мне здесь не хватает?

Спасибо Mauro

1 Ответ

0 голосов
/ 07 мая 2018

Кажется, это ошибка 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;

Подразумевает, что ваш компилятор это прекрасно понимает. Протестировано с g ++ - 5.4.0 и gdb-7.11.1 под Ubuntu.

РЕДАКТИРОВАТЬ Автономный пример:

#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, и у вашего кода не будет проблем с использованием статической карты.

Если это происходит без ошибок, то это проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...