Estoy tratando de implementar un patrón de fábrica registrando los punteros de función de la clase derivada a la fábrica en un mapa estático (miembro de la fábrica) y creando objetos por mirando el mapa Pero estoy obteniendo un error de segmentación al hacer esto.accediendo a un mapa estático de una función de miembro estático - falla de segmentación - C++
Fragmento de código:
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);
En la creación del objeto de fábrica en el principal archivar un segmentati en falla ocurre. ¿Puede sugerir si estoy haciendo algo mal? Estoy usando CppUTest para TDD y no estoy seguro de cómo depurar esto.
tenemos los typedef para 'Funcptr'. ¿Puedes reescribir tu código para que use el typedef en todas partes (y prueba)? Además, ¿por qué 'SquareCreator()' declaró 'static'? –
@KerrekSB: todavía no hay cambios. – Saaras
Sin conexión, ni siquiera estoy seguro ahora si los punteros a función son covariantemente compatibles. Intenté probarlo yo mismo, y obtuve un error rotundo de "no puedo convertir". –