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 :

Probleme de linkage


Sujet :

C++

  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2
    Par défaut Probleme de linkage
    Bonjours,
    j'ai besoin de creer deux classe heritant l'une de l'autre, la premiere possedant une methode virtuelle. Les classe compile et si je met une methode main vide, je peu meme executer. Mon probleme est que dès que j'entre une commande pour creer mon objet, j'ai une Linker error qui apparait et pas moyen de la corriger...

    Voici mon 1er code:
    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
     
    #ifndef _EXPRESSION_H
    #define _EXPRESSION_H
     
    #include <iostream>
     
    using namespace std; 
     
    class Expression{
          protected:
               int erreur;
     
          public:
               virtual float getValue();
               int getErreur(){
                   return erreur;
               }
    };
    #endif
    et le second
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    #ifndef _VALEUR_H
    #define _VALEUR_H
     
     
    #include <string.h>
    #include "Expression.cpp"
     
    using namespace std;
     
    class Valeur:public Expression{
          private:
                  float valeur;
          public:
                 Valeur(string chaine){
                        int c=0;      
                        int deci=1;
                        bool b=false;
                        valeur=0;
                        erreur=0;
                        char ch;
                        while (c<chaine.size()){
                              ch=chaine[c];
                              if (ch!=',' && ch!='0' && ch!='1' && ch!='2' && ch!='3' && ch!='4' && ch!='5' && ch!='6' && ch!='7' && ch!='8' && ch!='9'){erreur=1;}
                              if (ch!=','){
                                 valeur=10*valeur+ch-'0';
                                 c++;
                                 if (b){deci=deci*10;}
                              }else{
                                 b=true;
                              }
                        }
                        if (erreur==0){valeur=valeur/deci;}
                 }/*Creer un float a partir d'une string*/
     
                 Valeur(bool b){
                       valeur=0;
                       if (b){erreur=1;}else{erreur=0;}
                 }
     
                 float getValue(){
                       return valeur;
                 }
    };
     
    int main(){
        Expression* v1=new Valeur("12.3");
    }
     
    #endif

    et l'erreur que j'obtient:

    In function 'ZSt17__verify_groupingPKcjRKSs':
    [Linker error] undefined reference te 'vtable for Expression'
    id returned 1 exit status
    [BuildError] [Projet3.exe]Error 1



    Merci d'avance pour vos reponse et Bonnes fêtes a tous
    [EDIT]et encore dsl pour l'oubli de balise ^^

  2. #2
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Citation Envoyé par LordDarkseed Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Expression{
          protected:
               int erreur;
     
          public:
               virtual float getValue();
               int getErreur(){
                   return erreur;
               }
    };
    Salut, bienvenue et bonnes fetes.

    N'oublie pas d'utiliser les balises de codes (#) lorsque tu postes du code.

    Pour ton erreur je pense déjà qu'il y a un soucis avec la fonction getValue() de ta classe mère.

    Tu l'indique virtuelle mais pas pure, c'est à dire qu'il existe un comportement par défaut que ta classe mère doit implémenter.

    Soit tu la fait passer virtuelle pure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    virtual float getValue() = 0;
    Soit tu fournis l'implémentation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    virtual float getValue() { return 0.f }
    à plus

  3. #3
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2
    Par défaut
    Merci et desolé pour les balise de code

    Le probleme disparé avec l'implantation de base mais pas en declarant virtuel pure... c'est peut etre pas très joli mais je vais utiliser la 1er solution pour mon projet, mais peut tu qu'en meme m'expliquer pouquoi l'erreur ne disparait pas en la lacant virtuel pure?

  4. #4
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Je ne vois pas trop.
    Tu me montres tout ton code là ? Ou tu fais aussi un delete quelque part ? Généralement le destructeur d'une classe mère est souvent virtuel lorsqu'on veut utiliser le polymorphisme, sinon l'appel à delete ne fait pas le ménage dans les classes filles. Mais je ne pense pas que ça vienne de là non plus. Je vois que tu inclues un .cpp, l'usage est plutôt de mettre les définitions des classes dans un .h ou .hpp à moins d'avoir une bonne raison de faire autrement.

    à plus.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par défaut
    Si cela ne marche pas avec la fonction virtuelle pure, c'est qu'il y a deux raisons :
    - soit que tu essaies d'instancier un objet de type Expression quelque part
    - soit que tu essaies d'instancier un objet dérivé du type Expression qui n'implémente pas ta fonction getValue()

Discussions similaires

  1. Problème de linkage SDL avec Builder 6 pro
    Par Invité dans le forum SDL
    Réponses: 5
    Dernier message: 28/04/2006, 02h44
  2. QT+DEV-CPP+LIBPQ : probleme de linkage
    Par Pe04 dans le forum Dev-C++
    Réponses: 2
    Dernier message: 31/03/2006, 11h31
  3. [MFC]+[dll] probleme au linkage
    Par BainE dans le forum MFC
    Réponses: 3
    Dernier message: 22/06/2005, 12h04
  4. [MFC ]Probleme de linkage d'une dll
    Par Lysis dans le forum MFC
    Réponses: 9
    Dernier message: 22/01/2004, 14h51
  5. Probleme de linkage avec DirectDraw7 sous BC++ 5.02
    Par bobtorn dans le forum DirectX
    Réponses: 3
    Dernier message: 07/10/2003, 20h14

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