IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Faire un casting quand on ne connais pas la classe à l'avance


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut Faire un casting quand on ne connais pas la classe à l'avance
    Salut

    [j'ai édité mon message voir plus bas]
    Dernière modification par Invité ; 11/11/2011 à 14h31.

  2. #2
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    Le patron de conception Factory :

    http://fr.wikipedia.org/wiki/Fabriqu..._de_conception)

    est la pour ca.

  3. #3
    Invité
    Invité(e)
    Par défaut
    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



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *mEntitee= static_cast<Humain*>(mInputManager->createInputObject(OISObject));
    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...
    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.

  4. #4
    Membre éprouvé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 552
    Points : 1 060
    Points
    1 060
    Par défaut
    Bonjour,

    En fait, il faut combiner plusieurs techniques à ma connaissance :


    - prototype (clone())

    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 );
    	}
    };
    - 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
    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

  5. #5
    Membre éprouvé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 552
    Points : 1 060
    Points
    1 060
    Par défaut
    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.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Il faurait peut-être aller voir du côté des traits (voir FAQ).

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,

    Regarde du côté de Camp : ici pour l'intro et ici pour la bibliothèque.

Discussions similaires

  1. StringBuilder quand on connais pas la taille du string
    Par jayfaze dans le forum Langage
    Réponses: 6
    Dernier message: 05/08/2010, 14h30
  2. faire un forward quand l'action n'est pas trouvée
    Par newbeewan dans le forum Struts 1
    Réponses: 1
    Dernier message: 07/03/2007, 13h22
  3. $GET_['tmp'] quand tmp n'existe pas encore ?
    Par sunshine33 dans le forum Langage
    Réponses: 3
    Dernier message: 17/11/2005, 12h33
  4. [Avis] Faire du C quand on connait java
    Par Regis.C dans le forum Général Java
    Réponses: 16
    Dernier message: 10/10/2005, 16h04
  5. [XSL]Comment faire ceci ?? Mon for-each n'affiche pas tout !
    Par Devil666 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 27/07/2005, 15h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo