Salut
[j'ai édité mon message voir plus bas]
Salut
[j'ai édité mon message voir plus bas]
Dernière modification par Invité ; 11/11/2011 à 14h31.
Le patron de conception Factory :
http://fr.wikipedia.org/wiki/Fabriqu..._de_conception)
est la pour ca.
Salut,
alors c'est de ma faute je me suis gouré dans mon message, je devais etre fatigué c'est pour ca. Une factory va me renvoyé une instance de classe, c'est ça ? moi ce que je veux c'est qu'on me renvoie une classe.
Imaginons que j'ai un casting de class
entre les deux chevron il y a la classe Humain, c'est un exemple mais je ne connais pas forcement la classe à mettre, ce sera pas toujours Humain. Donc je voulais savoir s'il n'y avait pas moyen de mettre autre chose qu'une classe directement...
Code : Sélectionner tout - Visualiser dans une fenêtre à part *mEntitee= static_cast<Humain*>(mInputManager->createInputObject(OISObject));
J'ai essayé de mettre une variable entre les chevrons mais évidemment ca ne marche pas car il attend une classe...
donc connaissez vous une solution à cela ?
voila,
PS: oubliez mon premier message, je devais etre crevé
A+
Dernière modification par Invité ; 11/11/2011 à 14h47.
Bonjour,
En fait, il faut combiner plusieurs techniques à ma connaissance :
- prototype (clone())
- factory (registre contenant des instances servant de modèle pour la création des objets, référencée par leurs noms)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 class Object { public: virtual ~Object(); virtual Object* clone() const = 0 ; }; class MaClasse : public Object { public: virtual Object* clone() const { return new MaClasse( *this ); } };
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 class Factory { public: void registerPrototype( std::string const& name, Object* prototype ) { _prototype.insert( std::make_pair( name, prototype ) ); } Object* newInstance( std::string const& name ) const { typename std::map< std::string, Object* >::const_iterator it = _prototypes.find(name); return it->second->clone(); //utilisation du modele } private: std::map< std::string, Object* > _prototypes; };
Après, c'est assez intéressant de rentabiliser les templates pour wrapper les types natifs (sans hériter manuellement d'un Object):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 template < typename T > class Wrapper : public Object { public: typedef T native_type ; Wrapper(): _value() { } Wrapper( native_type const& value ): _value(value) { } Wrapper( Wrapper const& other ) { } virtual Object* clone() const { return new Wrapper( *this ); } private: native_type _value ; };
J'espère que ça te donnera des idées (les contrôles sont absents : type déjà existants etc...)
PS : Tu peux jeter un oeil à cet article qui va au delà de tes attentes
http://www.vollmann.ch/en/pubs/meta/meta/meta.html
Bye
Heu, pour la deuxième question, je n'arrive pas à comprendre pourquoi vous avez besoin de ça... Si vous ne connaissez pas la classe à la compilation, vous ne connaîtrez pas les méthodes qu'elle expose.
Quand des objets dérivés ont le même comportement, on pose les mêmes méthodes.
Quand on veut utiliser dynamiquement (à l'exécution) ce même comportement, on passe par les méthodes virtuelles. Quand on veut le faire à la compilation, on passe par les templates.
Il faurait peut-être aller voir du côté des traits (voir FAQ).
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager