我的目標是創建一個系統,我可以在運行時提供一個類的字符串名稱,並讓它依次返回該類的一個實例。 搜索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
如果有人能幫助消除這些錯誤,我將不勝感激。 或者我可能首先想到的是完全錯誤的,所以如果有人覺得我應該完全朝不同的方向發展,請告訴我。
在此先感謝。
請將變量名稱映射更改爲別的。閱讀代碼時很混亂。 – 2010-11-25 06:38:16