我想通過註冊派生類的函數指針到工廠在靜態映射(工廠的成員)和創建對象的工廠模式實現查找地圖。但是我在這樣做時遇到了分段錯誤。從靜態成員函數訪問靜態映射 - 分段錯誤 - C++
代碼段:
factory.cpp
typedef Shape* (*Funcptr)();
std::map<int,Funcptr> Factory::funcmap;
int Factory::registerCreator(int ShapeID, Shape *(*CFuncptr)()) {
Factory::funcmap[ShapeID] = CFuncptr;
return 1;
}
Shape* Factory::CreateObject(int ShapeID) {
std::map<int,Funcptr>::iterator iter;
iter = funcmap.find(ShapeID);
if(iter != funcmap.end()){
return iter->second();
}
return NULL;
}
factory.h
class Factory {
public:
Factory();
virtual ~Factory();
static int registerCreator(int, Shape *(*CFuncptr)());
Shape* CreateObject(int);
private:
static std::map<int,Funcptr> funcmap;
};
Square.cpp
static Shape *SquareCreator() {
return new Square;
}
static int SquareAutoRegHook = Factory::registerCreator(1,SquareCreator);
在主創建對象工廠文件分段發生故障。 你可以請建議,如果我做錯了什麼。我正在使用CppUTest進行TDD,不知道如何調試。
粗略地講,不同的.cpp文件顯示爲'Funcptr' typedef的。你可以重寫你的代碼,以便在任何地方使用typedef(和測試)嗎?另外,爲什麼'SquareCreator()'聲明'靜態'? –
@KerrekSB:依然沒有變化。 – Saaras
無關緊要的是,如果函數指針總是兼容的話,我現在還不確定。我只是試圖自己測試這個,而我剛剛得到了一個「無法轉換」的錯誤。 –