2010-11-25 42 views
0

我的目標是創建一個系統,我可以在運行時提供一個類的字符串名稱,並讓它依次返回該類的一個實例。 搜索stackoverflow,我遇到了一個似乎正在做我正試圖完成的例子,雖然我目前無法正確編譯它。以下是基於代碼:如何修復我的工廠模式以消除這些編譯錯誤?

//LevelObject.h  
#pragma once 

#include <map> 
#include <string> 

class LevelObject 
{ 
    protected: 
     int ID; 

    public: 
     template<class T> static LevelObject* createT(void) 
     { 
      return new T(0); 
     } 

     LevelObject(void); 
     ~LevelObject(void); 
}; 

struct BaseFactory 
{ 
    typedef std::map<std::string, LevelObject*(*)()> map_type; 

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

    private: 
     static map_type* objectMap; 

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

template<class T> 
struct DerivedRegister : BaseFactory 
{ 
    DerivedRegister(const std::string& s) 
    { 
     getMap()->insert(std::make_pair(s, &LevelObject::createT<T>)); 
    } 
}; 


//Item.h 
#pragma once 

#include "LevelObject.h" 

class Item : 
    public LevelObject 
{ 
    int ID; 
    static DerivedRegister<Item> reg; 

public: 
    Item(int id); 
    ~Item(void); 
}; 


//Item.cpp 
#include "Item.h" 

Item::Item(int id) 
{ 
    ID = id; 
} 

Item::~Item(void) 
{ 
} 

DerivedRegister<Item> Item::reg("item"); 

的邏輯是,所導出的對象,即項目,將註冊的字符串,並參考該返回自己的一個實例的功能。在調用createInstance時,它將接收用戶輸入的字符串並使用映射來確定要返回的對象。

不幸的是,這個代碼不正確編譯,並給了我以下錯誤:

錯誤1錯誤C2752: '的std :: TR1 :: _ Remove_reference < _Ty>': 多個部分專業化 匹配的模板參數列表

錯誤2錯誤C2528: '抽象 聲明符':指針引用是 非法C:\ Program Files文件\微軟 視覺工作室 10.0 \ VC \包括\ type_traits 965

錯誤3錯誤C2528: '類型':指針 引用是非法的C:\程序 文件\微軟的Visual Studio 10.0 \ VC \包括\ type_traits 349

如果有人能幫助消除這些錯誤,我將不勝感激。 或者我可能首先想到的是完全錯誤的,所以如果有人覺得我應該完全朝不同的方向發展,請告訴我。

在此先感謝。

+0

請將變量名稱映射更改爲別的。閱讀代碼時很混亂。 – 2010-11-25 06:38:16

回答

0

我加空機構的LevelObject類的構造函數和析構函數:

LevelObject(void) { } 
~LevelObject(void) { } 

隨後宣佈BaeFactory類的靜態map成員變量:

BaseFactory::map_type* BaseFactory::map; 

和代碼,而無需在這兩個錯誤編譯GCC和Visual Studio。

+0

感謝您的及時響應,但在進行這些調整時,我仍然無法編譯它。 – Brandon 2010-11-25 07:06:14

+0

我注意到,沒有我發佈的代碼的最後一行,一切都會很好地編譯。當你測試一切時,你確定你複製了這一行嗎? – Brandon 2010-11-25 07:06:57

1

這個問題發佈已經很長時間了,但由於沒有答案,我也在這裏偶然發現,我想我會添加一個。我複製了相同的工廠代碼(來自StackOverflow回答here),並且遇到了同樣的問題。我在this StackOverflow答案找到解決方案。

事實證明,Visual Studio 2010(我假設你正在使用)與std::make_pair有問題。只需使用std::pair<std::string,LevelObject*(*)()>,您就可以輕鬆前往。至少這爲我解決了這個完全相同的問題。

相關問題