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

Langage C++ Discussion :

Obtenir un l'effet d'instanceof en java


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 21
    Par défaut Obtenir un l'effet d'instanceof en java
    Bonjour, je cherche un moyen propre de vérifier si mon objet est de tel ou tel type. typeid ne peut pas fonctionner car ces objets héritent du même.

  2. #2
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Une solution : implémenter une fonction virtuelle GetTypeName() const qui renvoie le nome de la classe.
    Avec une macro qui va bien, pour simplifier, ça peut donner ça :

    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
     
    #define DECLARE_TYPE(Class) \
    	virtual std::string GetTypeName() const {return #Class; }
     
     
     
    //-----------------------------------------------------------
    // IObject : Base class
    //-----------------------------------------------------------
     
    struct IObject
    {
    	IObject() {}
    	virtual ~IObject() {}
     
    	// Fonction to get the real type of the Class.
    	virtual std::string			GetTypeName	() const = 0;
     
    	// Polymorphic copy the object
    	virtual boost::shared_ptr<IObject>	Clone		() const
    	{
    		throw std::exception("This object is no clonable");
    	}
     
    };
    A +

  3. #3
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par 3uclide Voir le message
    Bonjour, je cherche un moyen propre de vérifier si mon objet est de tel ou tel type. typeid ne peut pas fonctionner car ces objets héritent du même.
    dynamic_cast<> devrait permettre ça (s'il s'agit juste de comparer deux types entre eux). C'est notamment le cas si les objets sont de la même hierachie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class A { };
    class B : public A { };
    class C : public A { };
    class D : public B { };
     
    A* a;
    ...
    D* d = dynamic_cast<D*>(a); // d == NULL si a n'est pas un objet du type D
    C* c = dynamic_cast<C*>(a); // c == NULL si c n'est pas un objet du type C
    RTTI doit être activé (ce n'est pas le cas dans les settings par défaut sous Visual Studio, mais c'est le cas avec g++).

    Ou es-ce que j'ao manqué quelque chose dans ta question ?
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    Ou es-ce que j'ai manqué quelque chose dans ta question ?
    Il demande un moyen propre ... "pourquoi faire ?" me parait être la meilleure réponse à sa question. S'il vient du Java il risque d'être habitué aux void*^WObject et non au typage bien plus strict des templates, plus les cas comme le double-dispatching qui peuvent-être résolu avec un pattern visiteur, ou encore le fait que le C++ dispose d'une meilleure sémantique de valeur ce qui lui permet d'esquiver les prises de choux que la communauté Java expérimente avec des fonctions comme equals (qui est un double dispatching dégénéré qui se résout avec les templates et 0 héritage en C++).
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    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
    Par défaut
    Bonjour,
    type_id retourne le type dynamique de l'objet si le type statique est polymorphe :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #include<typeinfo>
    #include <iostream>
     
    struct polymorphic_base
    {
       virtual ~polymorphic_base(){}
    };
    struct polymorphic_derived : public polymorphic_base
    {
    };
     
    struct non_polymorphic_base
    {
       ~non_polymorphic_base(){}
    };
    struct non_polymorphic_derived : public non_polymorphic_base
    {
    };
     
     
    template<class derivee, class base>
    void dump()
    {
       base b;
       derivee d;
       base &rb=b;
       base &rd=d;
       std::cout<<typeid(b).name()<<"\n";
       std::cout<<typeid(d).name()<<"\n";
       std::cout<<typeid(rb).name()<<"\n";
       std::cout<<typeid(rd).name()<<"\n";
    }
     
    int main()
    {
       std::cout<<"polymorphe : \n";
       dump<polymorphic_derived,polymorphic_base>();
       std::cout<<"non polymorphe : \n";
       dump<non_polymorphic_derived,non_polymorphic_base>();
     
       return 0;
    }
    Sortie :
    polymorphe :
    struct polymorphic_base
    struct polymorphic_derived
    struct polymorphic_base
    struct polymorphic_derived
    non polymorphe :
    struct non_polymorphic_base
    struct non_polymorphic_derive
    struct non_polymorphic_base
    struct non_polymorphic_base
    [EDIT] la réponse de Luc est la plus pertinente : pourquoi faire ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 21
    Par défaut
    je dois effectuer un traitement spécifique suivant l'objet. Si l'objet dérivé est de tel type je fais ceci, s'il est de se type, je fais cela...

    La réponse de "poukill" me semble le plus adapter, a moins que j'ai mal compris le dynamic_cast<>

    J'vais aller faire quelques testes.

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par 3uclide Voir le message
    je dois effectuer un traitement spécifique suivant l'objet. Si l'objet dérivé est de tel type je fais ceci, s'il est de se type, je fais cela...
    La seule bonne façon de faire ça, c'est une fonction virtuelle...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  8. #8
    Membre émérite
    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
    Par défaut
    Bonjour,

    Citation Envoyé par JolyLoic Voir le message
    La seule bonne façon de faire ça, c'est une fonction virtuelle...
    Humph, ceci aurait pas tendance à faire préférer l'héritage à la composition?

Discussions similaires

  1. Réponses: 3
    Dernier message: 31/10/2012, 12h26
  2. [FLASH MX2004] Obtenir un effet "grattage" ?
    Par Ticoche dans le forum Flash
    Réponses: 18
    Dernier message: 30/11/2007, 17h53
  3. [JAR]Obtenir les sources de l'api Java
    Par compu dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 18/11/2005, 01h53
  4. Réponses: 2
    Dernier message: 31/10/2005, 18h30
  5. [Java] Obtenir le XPath d'un noeud DOM
    Par krappa dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 26/09/2005, 16h06

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