Код: Выделить всё
class Factory
{
public:
template
DerivedType::CreatedType *createType()
{
DerivedType::CreatedType *r = (DerivedType::CreatedType) (*(m_creators[DerivedType::id]))();
return r;
}
protected:
static std::map m_creators;
};
std::map Factory::m_creators = std::map();
template
class CRTPFactory : public Factory
{
typedef typename CreatedType CreatedType;
public:
static bool register()
{
Factory::m_creators.push_back(std::make_pair(Derived::id,Derived::create);
return true;
}
private:
static bool m_temp;
};
template
bool CRTPFactory::m_temp = CRTPFactory::register();
class AFactory : public CRTPFactory
{
private:
static A *create()
{
//do all initialization stuff here
return new A;
}
public:
static const int id = 0;
};
Решение, которое я использую в VS, - это в dllexport AFactory, таким образом компилятор компилирует класс, даже если ему неизвестно, кто создал его экземпляр. Это потому, что предполагается, что какая-то другая dll может создать его экземпляр. Проблема с этим решением заключается в том, что фабричный класс должен быть реализован в отдельной dll, как и остальная часть кода. А также это не работает в GCC.
Подробнее здесь: https://stackoverflow.com/questions/174 ... ed-classes
Мобильная версия