Я пытаюсь создать шаблон абстрактной фабрики для нескольких абстрактных фабрик в C ++ и придумал это.
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#include <map>
#include <stdio.h>
class Base
{
public:
virtual ~Base() {}
virtual bool Get() = 0;
};
class DerivedA : public Base
{
public:
bool Get()
{
return true;
}
};
class DerivedB : public Base
{
public:
bool Get()
{
return false;
}
};
template <class T>
class Creator
{
public:
virtual ~Creator(){}
virtual T* Create() = 0;
};
template <class T>
class DerivedCreator : public Creator<T>
{
public:
T* Create()
{
return new T;
}
};
template <class T, class Key>
class Factory
{
public:
void Register(Key Id, Creator<T>* Fn)
{
FunctionMap[Id] = Fn;
}
T* Create(Key Id)
{
return FunctionMap[Id]->Create();
}
~Factory()
{
std::map<Key, Creator<T>*>::iterator i = FunctionMap.begin();
while (i != FunctionMap.end())
{
delete (*i).second;
++i;
}
}
private:
std::map<Key, Creator<T>*> FunctionMap;
};
int main(int argc, char** argv[])
{
_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);
//Register
Factory<Base, char*> temp;
temp.Register("DA", (Creator<Base>*)new DerivedCreator<DerivedA>);
temp.Register("DB", (Creator<Base>*)new DerivedCreator<DerivedB>);
//Pointer to base interface
Base* pBase = 0;
//Create and call
pBase = temp.Create("DA");
printf("DerivedA %u\n", pBase->Get());
delete pBase;
//Create and call
pBase = temp.Create("DB");
printf("DerivedB %u\n", pBase->Get());
delete pBase;
return 0;
}
Он компилируется и работает нормально без утечек памяти (win32 crtdbg), но я неНе знаю, действительно ли это правильный способ сделать абстрактный шаблон фабрики.
temp.Register("DA", (Creator<Base>*)new DerivedCreator<DerivedA>);
Меня также интересует строка выше.Я смущен, почему я должен сыграть.Я не очень хорошо понимаю шаблоны, но я предполагаю, что они должны работать нормально, учитывая, что и класс шаблона, и фактический класс являются производными.
Этот код работает нормально, как показано выше, и даже удаляется без утечек памяти.Мне просто не очень комфортно с этим.
Мне не удалось найти реальных примеров шаблонных классов, кроме этого, из MaNGOS (эмулятор wow) - https://mangos.svn.sourceforge.net/svnroot/mangos/trunk/src/framework/Dynamic/ObjectRegistry.h
Но я не думаю, что смогу использовать этот метод в своем проекте, потому что планирую использовать библиотеки DLL в какой-то момент в моем проекте, и он использует CRTP, что противоречит моим требованиям к полиморфизму во время выполнения.