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
    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