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 :

recuperer le type


Sujet :

C++

  1. #1
    Fry
    Fry est déconnecté
    Membre régulier Avatar de Fry
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 150
    Points : 119
    Points
    119
    Par défaut recuperer le type
    comment connaitre le type d une classe herite a partir d un pointeur de la classe de base?
    par exemple je charge plusieur pointeur sur des object different mais heritant tous de la meme classe de base dans un std::map
    est ce qu il est possible ensuite en parcourant la map de savoir de quel type est le pointeur?

    j ai essayer avec l operateur typeid mais ca me renvoi le nom de la classe de base...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for( objit = it->second.MapObject.begin(); objit != it->second.MapObject.end(); objit++)
    {
    //identification du type:
    const type_info &t1=typeid(*objit->second); 
    cout << "Type: " << t1.name() << endl;
    }

  2. #2
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Bonjour, tu devrais peux être prévoir une méhode virtuelle abstraire dans la classe de base te renvoyant un type énuméré.

    Une autre possibilité, mais peu élégante est de faire une suite de dynamic cast, en testant le retour (a-t-il marché ou non).

    Cette méthode présente l'inconvenient de ne pas être extensible sans retouché le code à chaque fois, donc problème si tu ajoutes d'autres classes héritées de ta classe de base.

    Mais de manière générale, en C++, il faut cogiter sa hirarchie de classe pour éviter ce genre de problématique...

  3. #3
    Fry
    Fry est déconnecté
    Membre régulier Avatar de Fry
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 150
    Points : 119
    Points
    119
    Par défaut
    j ai pas trouver d autre moyen d eviter ce genre de problematique que d utiliser plusieur conteneur...
    cependant en ajoutant ca au classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    private:
    	static const char type[];
    public:
    	virtual string	GetType(){ return GUIImage::type; }
    la recuperation des type marche sauf que apres avoir utiliser le constructeur de recopie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            GUIObject* a = new GUIObject(*this->currentobj);
    le type renvoyer est toujour GUIObject meme en cas de recopie d un GUIImage par exemple
    il doit falloir caster mais etant donne qu il peut y avoir plusieur type??

  4. #4
    Fry
    Fry est déconnecté
    Membre régulier Avatar de Fry
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 150
    Points : 119
    Points
    119
    Par défaut
    effectivement fallait bien caster
    GUIObject* a = new GUIImage(*reinterpret_cast<GUIImage*>(this->currentobj));

  5. #5
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 150
    Points : 180
    Points
    180
    Par défaut
    http://msdn.microsoft.com/library/en...asp?frame=true

    Il faut faire attention, car si tu passes ton pointeur à type_id il renverra effectivement le type du pointeur, en l'occurence le type de ta classe de base, en revanche, si tu lui passes *ptr c'est a dire, l'objet pointé par ton pointeur, typeid te donnera le nom de ta classe.

    fais attention de bien compiler avec RTTI. et regardes bien l'url ci-dessus.

    Ciao cacao

  6. #6
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    reinterpret_cast est tres dangereux. Il t'empêcheras pas de caster un toto en tutu. Utilise plutot dynamic_cast qui lui échouera si ce n'est pas le bon type. Ou alors tu tests le type de ton pointeur avec typeid (voir le RTTI).

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Si tout ce que tu veux faire est copier un objet polymorphique, tu devrais plutôt lorgner du côté du design pattern du clone. Ni dynamic_cast, ni identifiant de classe.

    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
    struct Base
    {
        virtual ~Base();
        virtual Base* Clone() const = 0;
    };
     
    struct Derivee
    {
        virtual Base* Clone() const
        {
            return new Derivee(*this);
        }
    };
     
    Base* Obj = new Derivee;
    Base* Copy = Obj->Clone();

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Tableaux] PB recuperation données type enum/set
    Par Tr@nkill dans le forum Langage
    Réponses: 2
    Dernier message: 05/04/2006, 16h49
  2. recuperer le type du parametre (void*)
    Par kacedda dans le forum C
    Réponses: 15
    Dernier message: 01/02/2006, 09h44
  3. Recuperer le type de donnée
    Par Pe04 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 14/12/2005, 16h01
  4. Recuperer le type et la taille d'un champ
    Par bassim dans le forum Bases de données
    Réponses: 4
    Dernier message: 04/11/2005, 20h50
  5. tagVARIANT ou recuperer un type VT_ARRAY | VT_R8
    Par barthelv dans le forum MFC
    Réponses: 2
    Dernier message: 29/08/2005, 16h40

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