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 :

Transtypage dynamique : pré-requis


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Par défaut Transtypage dynamique : pré-requis
    Bonjour,

    Certains disent qu'afin d'utiliser dynamic_cast, il est nécessaire d'avoir une méthode déclarée en virtuel dans la classe mère de la classe utilisé. Voir que ce soit carrément la classe mère qui doit être déclarée en virtuel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class MaClassefille : virtual public MaClasseMère
    Et d'autre disent que rien de tout cela n'est nécessaire.

    J'aimerai donc avoir votre opinion la dessus, et aussi, est ce que cette optique/obligation peut changer en fonction des bibliothèques qu'on serait susceptible d'utiliser?

  2. #2
    screetch
    Invité(e)
    Par défaut
    ce n'est pas vraiment une opinion, c'est un fait.

    pour que dynamic_cast puisse fonctionner il est necessaire que la classe aie une vtable, c'est a dire qu'elle aie au moins une methode virtuelle connue

    par exemple :

    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
     
    class Mere
    {
    };
     
    class Fille : public Mere
    {
    	virtual void doStuff() { };
    };
     
    int main(int argc, char** argv)
    {
    	Mere* fille = new Fille;
    	dynamic_cast<Fille*>(fille)->doStuff();
    }
    refusera de compiler (le compilateur dit : "Mere is not a polymorphic type"

    en revanche
    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
    class Mere
    {
    public:
    	virtual ~Mere();
    };
     
    class Fille : public Mere
    {
    public:
    	virtual void doStuff() { };
    };
     
    int main(int argc, char** argv)
    {
    	Mere* fille = new Fille;
    	dynamic_cast<Fille*>(fille)->doStuff();
    }
    fonctionne

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Par défaut
    Je vois que tu as déclaré le destructeur en virtual, j'ai vu dans une autre discution (que je ne pourrais pas situer pour faute d'oublie) que c'était la méthode de base (ou une convention peut être?) pour déclarer une classe polymorphique. J'aimerai donc être sûr: est ce que je peux déclarer n'importe qu'elle méthode en virtual? Même si je ne me sers pas de cette méthode ?

    Tu as déclaré doStuff() en virtual aussi: est-ce nécessaire ou la aussi, on aurait pu déclarer n'importe qu'elle méthode en virtual?

  4. #4
    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
    En C++, la philosophie est de ne pas payer pour ce qu'on n'utilise pas. Ainsi, une classe n'ayant pas de fonction virtuelle ne possède pas les structures nécessaires pour faire du dynamic_cast. A partir du moment où une fonction virtuelle, n'importe laquelle, existe, c'est bon.

    Pourquoi le destructeur ? Parce que.
    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.

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Par défaut
    D'accord, et merci.
    Mais est-il aussi necessaire d'avoir une méthode virtuelle dans notre classe fille pour utiliser Dynamic_cast?
    dans l'exemple de Screetch:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    virtual void doStuff() { };
    donc ceci est-il nécessaire?

  6. #6
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Non, ça laisse sous-entendre qu'on peut "tranquillement" dériver la classe Fille en une classe FilleFille () par exemple.

  7. #7
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    En fait, le tout est, tout simplement, de comprendre ce que signifie le mot clé virtual quand il est placé devant une méthode...

    En gros, cela revient à dire au compilateur:
    Citation Envoyé par toi au compilateur
    J'ai donné un comportement à cette méthode, qui est adapté à la classe que j'ai créée...
    Mais les classes qui héritent de cette classes peuvent redéfinir ce comportement pour l'adapter à leurs besoins
    cela revient aussi à dire au lecteur du code (toi, dans 6 mois ou un collaborateur)
    Citation Envoyé par toi au lecteur
    Si tu fais hériter une nouvelle classe de cette classe-ci, tu peux redéfinir le comportement de cette méthode pour l'adapter à ton cas particulier
    Une fois que tu envisage les méthodes virtuelles sous cet angle, il devient facile de comprendre que le raisonnement du compilateur sera
    Citation Envoyé par le compilateur à lui-même
    Cette méthode risque d'être redéfinie par d'autres classes
    Je dois donc la mettre quelque part d'où je pourrai, lors de l'appel, choisir l'implémentation en fonction du type réel de l'objet au départ duquel cette méthode est appelée
    cet "endroit particulier" n'étant rien d'autre que... la VTable.

    Puis viennent les considérations philosophiques émises par JolyLoic (qui, bien qu'elle soient "philosophiques" nécessitent d'être prises en compte): l'utilisation de la VTable a un cout, et donc, on préfère ne payer ce cout que si on en a réellement besoin (pourquoi prendre un autoroute à péage si ce n'est ni plus rapide ni moins long que si on allait par les nationnales )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Par défaut
    Citation Envoyé par JolyLoic
    A partir du moment où une fonction virtuelle, n'importe laquelle, existe, c'est bon.
    Envoyé par toi au compilateur
    J'ai donné un comportement à cette méthode, qui est adapté à la classe que j'ai créée...
    Mais les classes qui héritent de cette classes peuvent redéfinir ce comportement pour l'adapter à leurs besoins
    le fait de déclarer une seule méthode en virtual, permet de redéclarer n'importe quelle méthode même non virtual?

    Ce qui voudrait dire (j'espère que je comprends bien):
    Envoyé par toi au compilateur
    J'ai donné un comportement à cette méthode, qui est adapté à la classe que j'ai créée...
    Mais les classes qui héritent de cette classes peuvent redéfinir les comportements de n'importe qu'elle méthode de la classe mère pour l'adapter à leurs besoins
    Si tel est le cas, pourquoi m'arrive t-il de voir plusieurs méthodes d'une classe déclarées virtuelles?

    Merci pour toutes vos réponses, elles m'aident beaucoup

  9. #9
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Ca permet simplement de dire au compilateur :
    Je vais laisser la possibilité aux classes filles de rédéfinir telles et telles fonctions et ce seront celles-ci qui seront appelées en temps voulu grâce au polymorphisme, mais pas les autres.

    Celles que les classes filles pourront redéfinir et qui seront appelées lorsque l'on aura un pointeur ou une référence sur la classe Mère, ce sont les méthodes devant lesquelles il y aura un virtual.

  10. #10
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par Somato Voir le message
    le fait de déclarer une seule méthode en virtual, permet de redéclarer n'importe quelle méthode même non virtual?
    Excuses moi, j'ai manqué de précision... j'aurais du écrire "mais les classes qui héritent de celle-ci peuvent redéfinir cette méthode bien particulière".

    Il est possible, effectivement, de redéfinir une méthode non virtuelle dans les classes filles, mais il n'y a alors aucun comportement polymorphique possible: la redéfinition de la méthode dans la classe fille "cache" ("surcharge") tout simplement celle de la classe mère...

    Avec la conséquence suivante
    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
     
    /* soient les classes */
    class Mere
    {
        public:
            void function(){/*...*/}
            /* tout le reste */
    };
    class Fille : public Mere
    {
        public:
            void function(){/*...*/}
            /* tout le reste */
    };
     
    int main()
    {
        /* aucun polymorphisme espéré */
        Fille f1;
        f1.function(); // appelle la méthode Fille::function()
        /* maintenant, on espère le polymorphisme en considérant
         * l'objet de type Fille comme s'il était un objet de type Mere
         */
        Mere *f2=new Fille();
        f2->function(); //raté... on appelle la méthode Mere::function, là où
                        // on espérait appeler Fille::function
        delete f2;
        return 0;
    }
    Pour que le comportement polymorphique puisse apparaitre, il faut que la méthode appelée soit... virtuelle
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  11. #11
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Par défaut
    Alors en gros:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Class Mère
          public: 
              mère();
              ~mère();
              virtal méthode1();
              méthode2();
     
    Class Fille : public Mère
    //possibilité ici de redéfinir la méthode1 si nécessaire, mais en aucun cas la méthode2?
    Dans mon cas d'étude (et donc le cas pour le quel je me pose tant de question):
    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
    Class Mère:
          public: 
              mère();
              ~mère();
              virtal méthode1();
              méthode2();
     
    Class Fille1 : public Mère
           public:
              fille1();
              ~fille1();
              virtual méthode3();
              méthode4()
     
    Class Fille2 : public Mère //je veux y réutiliser une méthode de Fille1
    ...
            Fille1 *monObjet = new Fille1();
            dynamic_cast<Fille1>(monObjet)->méthode4() //malgrès le fait que méthode4 ne soit pas virtuelle?
    EDIT: Je vais lire le post précédent que je n'avais pas lu...
    Après lecture: étant donné que Fille hérite de Mère dans mon premier code: pas besoin de virtual pour modifier les méthodes dans la classe Fille donc

  12. #12
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Si ton pointeur est déjà déclaré comme pointant sur un objet de type Fille1, tu n'a même pas besoin d'effectuer le transtypage vers... le type qui est réellement le sien.

    Si ton pointeur est déclaré comme pointant sur un objet de type Mere, alors que c'est en réalité un objet de type Fille1, il faut effectivement effectuer un transtypage vers le type adéquat pour appeler les méthodes qui ne sont pas déclarées dans la classe Mere, mais qui le sont dans la classe Fille
    [EDIT]
    Si, enfin, ton pointeur est déclaré comme pointant sur un objet de type Mere, alors que c'est en réalité un objet de type Fille2, la conversion échouera[/EDIT]

    Ainsi une méthode de fille2 prise au hasard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void Fille2::Methode4()
    {
        Mere *obj1=new Fille1();
        dynamic_cast<Fille1*>(obj1)->methode3(); //OK transtypage indispensable :D
        Fille1 *obj2 =new Fille1();
        obj2->methode3(); //meme pas besoin de transtyper ;)
        Mere *obj3 = new Fille2();
        dynamic_cast<Fille1*>(obj3)->methode3();//Aiie...bobo... conversion impossible
        obj1->methode1();//pas de problème: comportement de base
        obj2->methode1();//pas de problème: comportement polymorphique
        obj3->methode1();//pas de problème: comportement polymorphique
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  13. #13
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    dynamic_cast<Fille1*>(obj3)->methode3();//Aiie...bobo... conversion impossible
    Comportement indéfini car dynamic_cast retournera un pointeur nul.

    On n'a pas ce problème avec des références:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    dynamic_cast<Fille1&>(*obj3).methode3()
    Ici, le code lancera une exception std::bad_cast.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    dynamic_cast<Fille1*>(obj3)->methode3();//Aiie...bobo... conversion impossible
    Comportement indéfini car dynamic_cast retournera un pointeur nul.

    On n'a pas ce problème avec des références:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    dynamic_cast<Fille1&>(*obj3).methode3()
    Ici, le code lancera une exception std::bad_cast.
    Ben, qu'il s'agisse d'une exception bad_cast lancée (mais dont la récupération n'est pas prévue), d'une erreur de segmentation (souvent observée) du fait d'une tentative de NULL->methode, du formattage du disque dur ou du lancement d'une bombe atomique sur moscou, tu avouera que cela fera de toutes manière bobo, non
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  15. #15
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Sauf qu'une exception bad_cast, même non-prévue, n'est pas un comportement indéfini (appel de terminate() etc.)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #16
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Sauf qu'une exception bad_cast, même non-prévue, n'est pas un comportement indéfini (appel de terminate() etc.)
    Effectivement... je me rallie à tes arguments
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  17. #17
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void Fille2::Methode4()
    {
        Fille1 *obj2 =new Fille1();
        obj2->methode3(); //meme pas besoin de transtyper ;)
    }
    Ce comportement peut-il changer si on utilise une bibliothèque?
    Parce que dans mon cas, cela ne fonctionne pas (ou alors, il y a un petit quelque chose que j'ai omis).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class BibliClass2 : public BibliClass1 //Classes de la bibliothèque
               public:
                    void methode2() {...};
     
    class Maclass1 : public BibliClass1
               public:
                   void methode1() {BibliClass2 *obj1 = new BibliClass2();
                                            obj1->methode2(); //error: 'class BibliClass1' has no member named 'methode2'
                                          }

  18. #18
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Es tu déjà sur d'avoir inclus le fichier dans lequel est définie la BibliClass2, et non de n'avoir qu'une simple déclaration anticipée

    S'agit-il éventuellement d'une bibliothèque dynamique, (dll ou so selon le système d'exploitation)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  19. #19
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Par défaut
    j'ai bien l'include.
    et pardon, il ne s'agis pas d'une "bibliotèque" mais plutôt d'une "libraire" (je ne sais pas quel terme est le bon, on trouve tout sur le net, mais je me souviens avoir vu une discution ou quelqu'un démentait l'un des deux termes...).

    Sans trainer autour du pot: j'utilise Qt.
    (je ne pense pas aller poster à nouveau sur le forum Qt, étant donné qu'à la base, je venais chercher des informations sur les cas de fonctionnement du transtypage)

    Merci de votre aide

  20. #20
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    C'est bien "bibliothèque" qui est le bon terme.
    • .h --> Fichier d'en-tête
    • .lib, .a --> Bibliothèque [à liaison] statique.
    • .dll, .so --> Bibliothèque [à liaison] dynamique (souvent livrée avec une bibliothèque statique d'importation et un fichier d'en-tête).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Utiliser un transtypage "dynamique"
    Par JPLSOFT dans le forum Composants VCL
    Réponses: 3
    Dernier message: 07/05/2014, 08h49
  2. Un transtypage dynamique
    Par Asaheim dans le forum C#
    Réponses: 8
    Dernier message: 25/04/2013, 00h03
  3. Transtypage et objet dynamique pour l'interface
    Par TokTokTok dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 04/03/2009, 19h13
  4. Réponses: 3
    Dernier message: 28/01/2009, 14h02
  5. [Delphi 7]Transtypage et appels dynamique de methodes
    Par Jabbal'H dans le forum Delphi
    Réponses: 3
    Dernier message: 09/11/2006, 17h46

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