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 :

typeid et ses drôles de types


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Par défaut typeid et ses drôles de types
    Bonjour,
    Je suis les cours de C++ : http://cpp.developpez.com/cours/polyCpp/#LIV-I-2

    Je compile sur Code::Blocks ce code :

    .hpp
    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
    #ifndef IV-I-2_HeaderFile
    #define IV-I-2_HeaderFile
     
    class Animal {
        virtual void uneFonction() { // il faut au moins une fonction virtuelle
         // (car il faut des classes polymorphes)
        }
    };
     
    class Mammifere : public Animal {
    };
     
    class Chien : public Mammifere {
     
    };
     
    class Caniche : public Chien {
     
    };
     
    class Chat : public Mammifere {
     
    };
     
    class Reverbere {
     
    };
    #endif
    .cpp

    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
    /*  Utilisation de typeid*/
    #include <iostream>
    #include <conio.h> // Permet d'utiliser getch()
    #include <typeinfo>
    #include "IV-I-2.hpp"
     
    using namespace std;
     
    int main() {
        Animal *ptr = new Caniche;
     
        cout << typeid(ptr).name() << '\n';
        cout << typeid(*ptr).name() << '\n';
        cout << "L'animal pointe par ptr "
       << (typeid(*ptr) == typeid(Chien) ? "est" : "n'est pas")
       << " un chien\n";
        cout << "L'animal pointe par ptr est un "
       << typeid(*ptr).name() << "\n";
        return getch();
    }
    et j'ai pour rendu ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    P6Animal
    7Caniche
    L'animal pointe par ptr n'est pas un chien
    L'animal pointe par ptr est un 7Caniche
    au lieu d'avoir cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Animal *
    Chien
    L'animal pointé par ptr n'est pas un chien
    L'animal pointé par ptr est un Caniche
    Please tell me why...

  2. #2
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Si on remplace les \n par des endl, la sortie est déjà plus proche de ce qui est attendu.
    Par contre, je ne comprend pas pourquoi.

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Les ' sont utilisé pour des caractères, '\n' est un entier.
    Les " sont utilisé pour les chaînes de caractères, "\n" est une chaîne de caractère.

    Je pense qu'en remplaçant les '\n' par des "\n" devrait donner un meilleurs résultat.

  4. #4
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Salut

    Utilise std::endl au lieu de '\n' (ou "\n")
    Pour le problème avec typeid(ptr).name() qui retourne pas le nom correcte de la classe, c'est normal et non portable : un autre compilateur pourrait donner bien autre chose, ce qui est ton cas. C'est normalement utilisé pour débug et usage interne, pas pour faire de l'introspection

  5. #5
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Probablement le compilo qui change un peu les noms (comme le mangling), Sous VS2012 j'obtient le résultat attendu.
    Sous gcc 4.8 j'obtient le même résultat que toi.

    Citation Envoyé par Neckara Voir le message
    Les ' sont utilisé pour des caractères, '\n' est un entier.
    Non c'est un char, c'est comme '\0' c'est un char correspondant au caractère de code ascii 0.
    typeid('\n').name() renvoi "char".

    edit:
    P6Animal
    -> P pointeur, 6 le 6eme type rencontré et enregistré, puis le nom de la classe

  6. #6
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par Iradrille Voir le message
    edit:
    P6Animal
    -> P pointeur, 6 le 6eme type rencontré et enregistré, puis le nom de la classe
    P => pointeur
    6 => Nombre de lettres du nom du type

    Ca provient du name mangling de GCC.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  7. #7
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Citation Envoyé par Iradrille Voir le message
    Non c'est un char, c'est comme '\0' c'est un char correspondant au caractère de code ascii 0.
    typeid('\n').name() renvoi "char".
    Je penses que tu confonds entier et "int".
    Un char est un entier tout comme un int.

    A ne pas confondre avec un caractère qui lui peut être codé sur un char ou plus (ex : utf-8, utf-16, utf-32, ...)

    D'après typeid, les caractères accentué comme 'é' seraient codé sur un int.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par Neckara Voir le message
    A ne pas confondre avec un caractère qui lui peut être codé sur un char ou plus (ex : utf-8, utf-16, utf-32, ...)
    Je crois que tu confonds character et wide character.

    Car un char est bien un character, et inversement.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/05/2009, 15h16
  2. Coloration de ses types
    Par Bakura dans le forum Visual C++
    Réponses: 0
    Dernier message: 05/11/2008, 21h54
  3. creer ses propres type de données
    Par charlie_p07 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 14/04/2008, 17h22
  4. Réponses: 1
    Dernier message: 05/08/2007, 14h46

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