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 :

[VC9][C++] Le compilateur confond des methodes


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2004
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2004
    Messages : 230
    Par défaut [VC9][C++] Le compilateur confond des methodes
    Bonjour,

    Je vous explique la situation:

    Je code une sorte d'interface graphique pour un jeu avec Ogre.
    Lorsqu'on ajoute des objets dans le SceneGraph il donne la possibilite d'affecter a l'entite un objet personnel pour peu qu'il herite d'une classe.

    J'ai cree une classe ZResource et ZPlayer qui heritent toute deux de la classe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class ZResource: public ZHasDisplayableObject,
                     public ZHasDescription,
                     public Ogre::UserDefinedObject
    UserDefinedObject:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        class _OgreExport UserDefinedObject
        {
        public:
            UserDefinedObject();
            virtual ~UserDefinedObject() {}
            virtual const String& getTypeName(void) const;
            virtual long getTypeID(void) const;
     
        };

    que j'ai redefinis dans mon code comme ceux ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    const Ogre::String&			ZResource::getTypeName(void) const
    {
    	return ZResource::TYPE_STRING;
    }
     
    long 						ZResource::getTypeID(void) const
    {
    	return RESOURCE_TYPE;
    }
    Meme si je doute que se soit interressant:
    lorsque j'ajoute un element a ma liste je fait ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void ZScene::addResourceToScene(ZResource *disp)
    {
    	this->addEntityToScene(disp);
    	disp->getDisplayableObject()->getEntity()->setUserObject(reinterpret_cast<Ogre::UserDefinedObject *> (disp));
    }

    et au clic:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Ogre::MovableObject *mov = (*it).movable;
    ....
    					Ogre::UserDefinedObject *u = mov->getUserObject();
     
     
    					std::cout << "id de lobjet = " << u->getTypeName()
    					<< std::endl;
    et sur le std::cout j'ai cette erreur:


    Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
    Et en debugant je vois que lors de l'appel a la methode il appel une autre methode a savoir setVisible d'une autre interface (ZHasDisplayableObject)


    Donc voila je ne comprends pas comment ca a pu se passer.
    A savoir que j'ai fait plusieurs rebuild, en debug et en release, j'ai le meme probleme ...

    Si qqun a une idee ca m'aiderais beaucoup
    Merci d'avance

  2. #2
    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 daedric Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void ZScene::addResourceToScene(ZResource *disp)
    {
    	this->addEntityToScene(disp);
    	disp->getDisplayableObject()->getEntity()->setUserObject(reinterpret_cast<Ogre::UserDefinedObject *> (disp));
    }
    reinterpret_cast signifie : "Compilateur, je sais ce que je fais, tu as beau croire que ce que je passe n'est pas un pointeur sur Ogre::UserDefinedObject, moi, je te dis que c'est est un."

    Et là, pas de bol, ce n'est est pas un. C'est un pointeur sur un ZResource. Pour en déduire un pointeur sous la sous partie de ZResource qui correspond à un Ogre::UserDefinedObject, il faut en interne qu'un offset soit appliqué à ce pointeur. Tu aurais de l'héritage simple, cet offset vaudrait 0, mais pour de l'héritage multiple, ça dépend des autres classes dont il hérite.

    Moralité : Ne pas utiliser reinterpret_cast, mais static_cast, qui lui fait le travail qui va bien.
    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.

  3. #3
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2004
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2004
    Messages : 230
    Par défaut
    Merci, ca marche
    Je ne pensais pas que ce genre de manipulation aurais ete necessaire

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

Discussions similaires

  1. [POO] sauvegarde d'objets et perte des methodes
    Par Matth_S dans le forum Langage
    Réponses: 3
    Dernier message: 23/12/2005, 15h47
  2. [Interfaces] Comment définir l'emplacement mémoire des methodes ?
    Par Clorish dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 16/12/2005, 14h45
  3. [IDE][D2005-2006] Ctrl + C et ordre des methodes
    Par eponette dans le forum EDI
    Réponses: 1
    Dernier message: 15/12/2005, 15h03
  4. [Compilateur] appel de méthodes avec signature similaire
    Par Monkeyget dans le forum Général Java
    Réponses: 4
    Dernier message: 30/03/2005, 20h14
  5. [Compilateur] Optimisation des conditions
    Par Pedro dans le forum Langage
    Réponses: 2
    Dernier message: 16/06/2004, 13h49

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