J'essaie de créer un modèle d'usine abstrait pour plusieurs usines abstraites en C++ et est venu avec cela.C++ Abstract Usine utilisant des modèles
#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;
}
Il compile et fonctionne très bien sans fuites de mémoire (win32 crtdbg) mais je ne sais pas si cela est vraiment la bonne façon de faire un modèle de fabrique abstraite.
temp.Register("DA", (Creator<Base>*)new DerivedCreator<DerivedA>);
Je m'interroge également sur la ligne ci-dessus. Je suis confus pourquoi je dois lancer. Je ne comprends pas très bien les modèles, mais je suppose que cela devrait fonctionner correctement, étant donné que la classe template et la classe réelle sont dérivées.
Ce code fonctionne réellement bien comme indiqué ci-dessus et supprime même bien sans fuites de mémoire. Je ne me sens tout simplement pas à l'aise avec ça.
Je n'ai pas pu trouver de véritables exemples de classes de modèle, sauf pour ce billet depuis MaNGOS (wow émulateur) - https://mangos.svn.sourceforge.net/svnroot/mangos/trunk/src/framework/Dynamic/ObjectRegistry.h
Mais je ne pense pas que je peux utiliser cette méthode dans mon projet parce que je prévois sur l'utilisation des DLL à un moment donné dans mon projet et il utilise CRTP qui est contre mon exigence pour le polymorphisme d'exécution.
Eh oui, la ligne que vous avez envoyé mauvais. Il n'y a pas de relation entre les deux types. Ils sont spécialisés pour différents types. Je ne sais pas non plus pourquoi vous vous occupez du CRTP. Habituellement, il est utilisé pour * éviter * les fonctions virtuelles. Mais vous en avez encore, alors pourquoi s'embêter avec les templates? – jalf
Eh bien ce que j'essaie de faire est de créer une solution en 3 parties. Programme, bibliothèque et DLL. La DLL contiendra l'implémentation, la bibliothèque contient l'usine et le programme utilise l'interface. Le modèle existe parce que je vais le faire beaucoup. Je l'utilise pour remplacer la sélection du pilote de mon moteur de jeu actuel. Actuellement, il a copié/collé le code pour la vidéo, la physique, l'entrée et l'audio. – NtscCobalt