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 :

[C++] erreur de compilation :


Sujet :

C++

  1. #1
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Par défaut [C++] erreur de compilation :
    bonjour tous le monde

    j'obtient le message d'eereur

    /usr/bin/ld: warning: libstdc++.so.5, needed by /usr/X11R6/lib//libGLU.so, may conflict with libstdc++.so.6
    /tmp/cc6qZpRX.o(.text+0x1d): dans la fonction « Arme::Arme() »:
    : undefined reference to `vtable for Arme'
    /tmp/cc6qZpRX.o(.text+0x41): dans la fonction « Arme::Arme() »:
    : undefined reference to `vtable for Arme'
    /tmp/cc3ex1cu.o(.text+0x6dd): dans la fonction « Joueur::tirer() »:
    : undefined reference to `Arme::tirer()'
    /tmp/ccUgnGtK.o(.gnu.linkonce.r._ZTI8M1Garand+0x8): undefined reference to `typeinfo for Arme'
    collect2: ld a retourné 1 code d'état d'exécution
    avec la commande suivante

    g++-3.4 *.cpp *.o -L/usr/X11R6/lib/ -lGLU -lSDL -lSDL_image -l SDL_mixer -lGL -lm -o main
    j'ai 3 classes (résumé ci-dessous)



    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 Joueur 
    {
         Arme arme_courante;
         ....
            Joueur();
    	void tirer();
    };
     
    Joueur::Joueur()
    {
             arme_courante = M1Garand();
    }
     
    void Joueur::tirer()
    {
    	arme_courante.tirer();
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class Arme :public Objet
     
    {
     
    	Arme();
     
     
     
    	virtual void tirer();
     
     
    };
    et la troisième

    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
     
    class M1Garand :public Arme
     
    {
     
    ...	
     
    	void tirer();
     
     
     
    };
     
    void M1Garand::tirer()
    {
     
    //code
     
    }
    voici mes question :

    1 - comment éviter le problème de conflit ?
    2 - quel est mon erreur dans mon programme ?[/code]

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ce ne serait pas ça ?

    http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.7

  3. #3
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Par défaut
    si j'ajoute dans le fichier 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
     
    #include "arme.h"
    #include "son.h"
     
     
     
    void Arme::tirer()
    {
    }
    void Arme::recharger()
    {
    }
    void Arme::charger_sons()
    {
    }
    ca marche

    mais alors je pose la question suivante .
    pourquoi faut-il définir les fonctions virtuelles ?

    j'ai principalement utilisé le polymorphisme en java
    et on ne donne que le nom de la fonction pas le code
    qui d'ailleur ne sert a rien puisqu'il est censé être remplacé par la même fonction d'une classe dérivée qui elle est implémentée ...

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 47
    Par défaut
    mais alors je pose la question suivante .
    pourquoi faut-il définir les fonctions virtuelles ?
    En C++ toutes les fonctions, non virtuelle pure, doivent être définit.

    Typiquement, si tu ne n'as besoin d'instancier ta classe Arme, tu peux écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Arme :public Objet 
     
    { 
     
       Arme(); 
     
     
     
       virtual void tirer() = 0; 
     
     
    };
    Par contre ta classe devient abstraite

  5. #5
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Par défaut
    j'ai un autre problème

    si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    virtual void tirer() 
    {
    };
    lorsque j'instancie une classe fille (Fusil par ex) , elle utilise la méthode tirer de la classe mere (Arme)


    si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    virtual void tirer() = 0;
    je ne peux plus déclarer mon arme de type Arme (casse générale) car mes méthodes sont abstraites (elles sont pourtant redéfinies dans Fusil)

    joueur.h:8: error: cannot declare field `Joueur::arme_courante' to be of type `
    Arme'
    joueur.h:8: error: because the following virtual functions are abstract:
    arme.h:30: error: virtual void Arme::tirer()
    arme.h:31: error: virtual void Arme::recharger()
    arme.h:34: error: virtual void Arme::charger_sons()
    il y a un truc que j'ai pas du capter

    comment je fais pour déclarer de type Arme et utiliser les méthodes de fusil sachant que j'ai fait :

    Arme monarme = Fusil();

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Par défaut
    http://c.developpez.com/faq/cpp/?page=virtual

    il me semble que je suis dans le cas d'une copie non polymorphique d'apres la faq,

    avec un pointeur ca marche mieu

    byzare le c++
    merci tous le monde

  7. #7
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    salut,

    si, c'est logique.

    si tu n'utilises ni pointeur ni référence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    B b;
    A a;
    ...
    a = b;
    alors tu recopies dans 'a', les données de 'b' qui peuvent l'être (tout ce que la classes B hérite de la classe A).
    donc tu reconstruit ton 'a' avec les données de 'b', mais ça reste un A. donc tu ne peux faire appel aux méthodes redéfinies dans B ou spécifiques à B.

    si tu utilises une référence ou un pointeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    B b;
    A * a;
    ...
    a = &b;
    alors 'a' pointe (ou fait référence) à 'b'. donc si tu appeles une méthode héritée de A qui a été redéfinie dans B, c'est la méthode de B qui est appelée. car bien qu'on ai un pointeur sur A, l'objet pointé est un B et la résolution polymorphique s'opère.

    en résumé, dans le 1er cas 'a' est un A et seulement un A. dans le 2ème cas, 'a' fait référence à un B (car un B est un A) donc le polymorphisme est possible.

    qu'est-ce que je suis bavard quand je me réveille en pleine nuit. jme sens un peu speed là !

  8. #8
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    [RESOLU] ?

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

Discussions similaires

  1. Erreur de compilation après modification du Uses
    Par DevelOpeR13 dans le forum Langage
    Réponses: 5
    Dernier message: 30/10/2007, 14h23
  2. Réponses: 2
    Dernier message: 23/09/2003, 14h32
  3. Réponses: 10
    Dernier message: 22/09/2003, 21h58
  4. Réponses: 4
    Dernier message: 27/08/2003, 21h34
  5. Réponses: 2
    Dernier message: 04/03/2003, 23h24

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