Partage
  • Partager sur Facebook
  • Partager sur Twitter

Vtable !

Erreurs et interrogations.

Sujet résolu
Anonyme
    9 août 2007 à 0:22:44

    Bonsoir, amis zér0s !
    Ayant fait quelques recherches et rencontré cette erreur :
    /tmp/ccJugB41.o: dans la fonction « Resource_loading_exception::Resource_loading_exception()»:
    exceptions.cpp:(.text+0xba): référence indéfinie vers « vtable for Resource_loading_exception»
    collect2: ld returned 1 exit status


    Je me suis demandé ce qu'était la « vtable » d'une classe. Merci d'avance pour vos réponses.
    • Partager sur Facebook
    • Partager sur Twitter
      9 août 2007 à 0:29:25

      je sais pas exactement comment çà fonctionne mais c'est une table qui gère les méthodes virtuelles, c'est notemment elle qui permet d'appeler la fonction de la fille sur un pointeur de la classe mère.

      1. Animal* p_ani = new Requin();
      2. p_ani->manger();

      ici, si la méthode "manger" est virtuelle et redéfinie dans la classe Requin, c'est celle de la classe Requin qui sera appelée même si c'est un pointeur vers la classe Animal.

      ps : tu codes en C++ pur ou avec des bibliothèques tierces ? si oui, lesquelles.
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        9 août 2007 à 0:31:31

        C++ pur, avec la lib standard et la SDL
        Mon problème vient de la dérivation de la classe std::exception.
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          9 août 2007 à 9:59:14

          fait voir ta classe dérivé de std::exception.
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            9 août 2007 à 12:41:18

            OK ! J'édite dans quelques secondes.
            1. class Resource_loading_exception : public std::exception
            2. {
            3.         Resource_loading_exception() throw();
            4.         virtual ~Resource_loading_exception() throw();
            5.         virtual const char* what() throw()
            6.     {
            7.         return this->_msg.c_str();
            8.     }
            9.         private:
            10.         std::string _msg;
            11. };


            et

            1. // Constructeur de l'exception de chargement de ressource.
            2. Resource_loading_exception::Resource_loading_exception() throw()
            3. {
            4.         _msg = "Erreur de chargement des ressources. Vérifiez votre installation.";
            5. }


            PS : L'indentation dans mon fichier est bonne, mais plutôt hasardeuse ici :)
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              9 août 2007 à 18:45:39

              Le virtual dans
              1. virtual const char* what() throw()
              me parait bizare.
              Tu as l'intention de faire de Resource_loading_exception une classe d'abstraction ?
              Si non , bazarde le virtual.
              • Partager sur Facebook
              • Partager sur Twitter
                9 août 2007 à 20:59:00

                Quoi? Le virtual est implicite ici. Il peut le mettre comme ne pas le mettre, cela ne changerait strictement rien.

                Je me souviens que c'est une erreur toute bête, mais je ne me souviens jamais de son origine -- j'utilise assez peu GCC. Cherche dans les archives du forum C++ de developpez.

                PS: n'aurais-tu pas dû dériver de std::runtime_error plutôt ?
                PPS: Le préfixage par "_" est déconseillé.
                • Partager sur Facebook
                • Partager sur Twitter
                C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                Anonyme
                  9 août 2007 à 22:47:13

                  J'ai fini par ne plus dériver, et tout est OK. Il s'agit d'un bug de g++. Merci.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    9 août 2007 à 23:02:55

                    C'est simple de se résigner !

                    Pour info, dès qu'une de tes classes est dérivable, nombre de compilateur ajoute à ta classe un pointeur communément nommé le vptr ou encore v-pointer, qui pointe sur la v-table. Donc si tu me suis, le pointeur vptr pointe sur la v-table qui, à son tour, possède un pointeur sur chacune des fonctions virtuelles. Lorsque tu instancies une classe de Base, le pointeur de la v-table est initialisé et pointe sur la méthode Base::methode. Si maintenant tu dérives cette classe et que tu crées un pointeur de type Base pointant sur un nouveau Derive, alors le pointeur de la v-table est initialisé pour pointer sur Derive::methode.

                    Voila, vous savez comment ça marche :D (pour une fois que j'apprends quelque chose ayant un rapport avec le polymorphisme voir même les ADT :-° )

                    Bonne programmation à tous !
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Vtable !

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown