2013-10-13 1 views
-6

Я знаю, что это было задано 10000 раз, однако у меня все еще возникают проблемы с его компиляцией. Обратите внимание на статическую карту-член.C++ не может инициализировать элемент статических данных

В функции getMap() я получаю неопределенную ошибку ссылки на элемент данных карты. Я попытался переместить эту функцию в файл cpp и объявить «карту» в этом файле. Однако затем я получаю противоречивую ошибку определения.

Может ли кто-нибудь объяснить мне, что происходит? Благодаря

Base.h

template<typename T> Base * createT() { return new T; } 
typedef std::map<std::string, Base*(*)()> map_type; 


class BaseFactory 
{ 
    static Base* createInstance(std::string const& s) 
    { 
     map_type::iterator it = getMap()->find(s); 
     if (it == getMap()->end()) 
      return 0; 

     return it->second(); 
    } 

protected: 
    static map_type *getMap() 
    { 
     if (!map) 
     { 
      map = new map_type; 
     } 

     return map; 
    } 

private: 
    static map_type * map; 
    static Base* createInstance(std::string const* s); 

public: 
    BaseFactory(); 
    ~BaseFactory(); 

}; 
+2

Итак, в 10001-й раз вы пропустили сообщение об ошибке плюс фактическую строку кода, указывающую на ошибку – P0W

+0

Спасибо, ребята, очень полезно. – tier1

+0

Вы неправильно поняли совет, который вам дали. Ответ заключается не в том, чтобы переместить функцию в файл cpp. Решение состоит в том, чтобы * добавить новый код * в файл cpp. Этот новый код определяет статический член. Как такая простая вещь может быть настолько сложной? – john

ответ

0

Следующая декларация в определении вашего класса не хватает:

private: 
    static map_type * map; 

В одном .cpp файл, вы должны также добавить:

map_type* BaseFactory::map = NULL; 

Эта статья также может помочь: Static data members (C++ only)
+ этот вопрос, который имеет почти 100 тыс. Мнений к настоящему времени: Initializing private static members

+0

Я не сделал свое изначальное определение. Я хотел сохранить все в файле заголовка, но я переместил ваше предложение под определение класса, и оно сработало. Спасибо за вашу помощь. – tier1

+1

@tkcsam: Я отредактировал свой ответ, чтобы сделать его более понятным. – LihO

Смежные вопросы