1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| class Fabrique
{
/* uniquement pour me laisser aller à ma fainéantise naturelle :D */
typedef std::map<idTypeDemande, Base*> map;
typedef typename map::const_iterator const_iterator;
public:
static Base * create(idTypeDemande id) const
{
const_iterator it=items.find(id);
if(it==items.end())
return NULL;
return it->second->clone(); // Les classes dérivées de Base sont
// clonables :D
}
private:
/* on "enregistre les différents types possible à l'initialisation ;)
*/
static map items;
};
void foo(/* paramètres éventuels */ )
{
Base *ptr=Fabrique::create(l_id_du_type_attendu);
if(ptr)
{
/* on fait ce qu'on a à faire */
AutreType obj;
obj.doSomething(ptr);
}
delete ptr; // on n'a plus besoin de l'objet créé dynamiquement, on le
// détruit ;)
}
/* tu pourrais même envisager le fait qu'une fonction renvoie le
* pointeur vers "quelque chose" qui sera en mesure de déterminer
* quand on peut libérer la mémoire :D
*/
Base * bar(/* parametres éventuels */)
{
Base *ptr=Fabrique::create(l_id_du_type_attendu);
if(ptr)
{
AutreType obj;
obj.doSomething(ptr);
}
return ptr; // j'ai fini mon travail, mais la fonction appelante a besoin
// du pointeur pour autre chose (qui ne me regarde pas)
}
int main()
{
Base * ptr = bar(/* paramètre utiles */);
// utlisation de ptr selon mes besoins
delete ptr; // il est plus que temps de libérer la mémoire
return 0;
} |
Partager