Publicité
+ Répondre à la discussion
Page 1 sur 2 12 DernièreDernière
Affichage des résultats 1 à 20 sur 28
  1. #1

    Homme Profil pro
    Apprenti
    Inscrit en
    décembre 2010
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : décembre 2010
    Messages : 86
    Points : -1
    Points
    -1

    Par défaut problème avec constructeur

    Bonjour,

    j'ai fait un constructeur dans une classe pour les nombres rationnels.

    Dans le fichier .cpp qui détaille le fichier .h pour les fonctions membres.
    Dans le fichier .h, je détaille, j'ai pour le constructeur dans la partie

    public :

    Code :
    Q(int a=0,int b=1); // le constructeur de la classe Q (le nombre 1 par défaut)
    ce qui par défaut , ce qui donne 0/1 par défaut.

    Le problème est que , par la suite dans mon int main(), je déclare un certain c comme étant de type Q (rationnel) avec :

    (ça devrait donc appeler la constructeur par défaut)

    mais à ce stade, je ne connais pas la valeur de c.

    et cela ne fonctionne pas. Voici le message d'erreur :

    undefined reference to `Q::Q(int, int)'


    Pourtant avant j'ai déclaré par exemple et ça marchait.


    Pourquoi ça ne marche pas quand je fais


    D'avance merci

  2. #2
    Inactif


    Homme Profil pro Guillaume Belz
    Biochimiste
    Inscrit en
    novembre 2008
    Messages
    5 318
    Détails du profil
    Informations personnelles :
    Nom : Homme Guillaume Belz
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Biochimiste
    Secteur : Santé

    Informations forums :
    Inscription : novembre 2008
    Messages : 5 318
    Points : 17 318
    Points
    17 318

    Par défaut

    Bonjour

    Pour rappel, le message suivant "ça ne marche pas" n'est pas un message d'erreur valide et n'aide pas du tout. Peux tu donner l'erreur exacte donné par le compilateur ou le comportement inattendu ?

    Merci

  3. #3
    Membre chevronné
    Homme Profil pro
    F5(){F5}
    Inscrit en
    avril 2008
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : F5(){F5}
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2008
    Messages : 477
    Points : 656
    Points
    656

    Par défaut

    tu n'as probablement pas defini ton constructeur dans ton cpp:
    PS:
    a(3,4) n'est pas une declaration mais un appel de fonction.

  4. #4

    Homme Profil pro
    Apprenti
    Inscrit en
    décembre 2010
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : décembre 2010
    Messages : 86
    Points : -1
    Points
    -1

    Par défaut

    J'ai mis le message d'erreur.

    En effet, j'ai appelé la fonction avec a(3,4)

    Dans mon cpp, j'ai fait :

    Code :
    1
    2
    3
    4
    Q::Q(int a,int b){ // Le constructeur                                                // le constructeur est une méthode
            num=a;
            den=b;
    }
    Et dans mon .h,

    Code :
    Q(int a=0,int b=1); // le constructeur de la classe Q (le nombre 0 par défaut)

  5. #5
    Inactif


    Homme Profil pro Guillaume Belz
    Biochimiste
    Inscrit en
    novembre 2008
    Messages
    5 318
    Détails du profil
    Informations personnelles :
    Nom : Homme Guillaume Belz
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Biochimiste
    Secteur : Santé

    Informations forums :
    Inscription : novembre 2008
    Messages : 5 318
    Points : 17 318
    Points
    17 318

    Par défaut

    On va mettre ça sur le coup de la fatigue et de la grippe

  6. #6
    r0d
    r0d est déconnecté
    Expert Confirmé Sénior

    Profil pro
    Inscrit en
    août 2004
    Messages
    4 088
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : août 2004
    Messages : 4 088
    Points : 5 129
    Points
    5 129

    Par défaut

    Tout ceci a l'air correct, le problème doit venir d'ailleurs.
    As-tu bien inclus le fichier d'en-tête adéquat dans le main?
    Sinon, copie le code complet, parce que le problème est ailleurs visiblement.

  7. #7

    Homme Profil pro
    Apprenti
    Inscrit en
    décembre 2010
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : décembre 2010
    Messages : 86
    Points : -1
    Points
    -1

    Par défaut

    Je suis en train de me dire que mon problème vient peut-être du fait que la classe porte un nom différent du fichier d'en-tête .h qui la contient.

    Je ne sais guère.

  8. #8
    r0d
    r0d est déconnecté
    Expert Confirmé Sénior

    Profil pro
    Inscrit en
    août 2004
    Messages
    4 088
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : août 2004
    Messages : 4 088
    Points : 5 129
    Points
    5 129

    Par défaut

    Citation Envoyé par matlab_ Voir le message
    Je suis en train de me dire que mon problème vient du faire que la classe porte un nom différent du fichier d'en-tête .h qui la contient.
    Il n'y a aucun lien entre le nom du fichier et le nom de la classe.

  9. #9
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2011
    Messages : 247
    Points : 118
    Points
    118

    Par défaut

    Code :
     undefined reference to `Q::Q(int, int)'
    Comme le dit rOd :
    As-tu bien inclus le fichier d'en-tête adéquat dans le main?
    Tu n'as pas inclus ou pas inclus le bon fichier header à l'endroit où tu déclares
    Sinon ça marcherait
    Es-tu sur que tu as respecté la casse si tu as inclus le bon fichier ? Ca arrive parfois de se tromper de cette manière et c'est toujours assez ennuyeux de chercher partout pour une toute petite erreur.

  10. #10
    Membre Expert
    Avatar de white_tentacle
    Inscrit en
    novembre 2008
    Messages
    1 284
    Détails du profil
    Informations forums :
    Inscription : novembre 2008
    Messages : 1 284
    Points : 1 771
    Points
    1 771

    Par défaut

    C’est une erreur de l’éditeur de lien

    undefined reference to `Q::Q(int, int)'
    .

    Je pense que tu compiles correctement la classe Q, puis correctement ton main, mais qu’à l’édition de lien, tu ne dis pas que le code de*Q se trouve dans le fichier .o généré et pas dans main.o.

    Bref, il faut que tu nous dises ce que utilises pour compiler (IDE ou makefile ou ligne de commande), et la structure de tes fichiers et les commandes appelées pour compiler.

  11. #11

    Homme Profil pro
    Apprenti
    Inscrit en
    décembre 2010
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : décembre 2010
    Messages : 86
    Points : -1
    Points
    -1

    Par défaut

    J'utilise un terminal et lignes de commande

    g++ cl.h
    g++ cl.cpp
    g++ fichiermain.cpp

  12. #12
    Membre Expert
    Avatar de white_tentacle
    Inscrit en
    novembre 2008
    Messages
    1 284
    Détails du profil
    Informations forums :
    Inscription : novembre 2008
    Messages : 1 284
    Points : 1 771
    Points
    1 771

    Par défaut

    Essaie ceci alors :

    g++ cl.cpp fichiermain.cpp -o programme

    Ensuite, quand tu vas faire un vrai programme, il te faudra un minimum te documenter sur un système de build (makefile basique, cmake, qmake, automake, etc, pas ça qui manque, il faut juste en choisir un, pour des choses simples un makefile basique fait très bien l’affaire, autant commencer par là).

  13. #13

    Homme Profil pro
    Apprenti
    Inscrit en
    décembre 2010
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : décembre 2010
    Messages : 86
    Points : -1
    Points
    -1

    Par défaut

    Dans le main, j'avais mis : #include "cl.h"

    A quoi sert-il d'ajouter -o ?
    Que cela engendre-t-il ?

    merci

  14. #14
    Membre Expert
    Avatar de white_tentacle
    Inscrit en
    novembre 2008
    Messages
    1 284
    Détails du profil
    Informations forums :
    Inscription : novembre 2008
    Messages : 1 284
    Points : 1 771
    Points
    1 771

    Par défaut

    -o sert simplement à donner le nom du fichier de sortie (par défaut c’est a.out). -c sert à dire de produire un fichier objet, et pas un fichier exécutable (sinon, le linker va râler sur l’absence de main). Dans un premier temps, ce sont les deux options indispensables à connaître.

    Je t’invite à lire :
    http://gl.developpez.com/tutoriel/outil/makefile/

    pour une introduction aux makefile. N’hésite pas aussi à lire l’aide de gcc.

  15. #15

    Homme Profil pro
    Apprenti
    Inscrit en
    décembre 2010
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : décembre 2010
    Messages : 86
    Points : -1
    Points
    -1

    Par défaut

    Et pourquoi ça ne marche pas si j'écris seulement g++ cl.h , g++ cl.pp et g++ monfichier.cpp puis ./a.out pour l' éxécuter ?

    merci

  16. #16
    Modérateur
    Avatar de koala01
    Profil pro Philippe Dunski
    Inscrit en
    octobre 2004
    Messages
    9 686
    Détails du profil
    Informations personnelles :
    Nom : Philippe Dunski
    Âge : 42

    Informations forums :
    Inscription : octobre 2004
    Messages : 9 686
    Points : 15 737
    Points
    15 737

    Par défaut

    Salut,
    Citation Envoyé par matlab_ Voir le message
    Et pourquoi ça ne marche pas si j'écris seulement g++ cl.h , g++ cl.pp et g++ monfichier.cpp puis ./a.out pour l' éxécuter ?

    merci
    Simplement parce que g++ est une application comme une autre, et que tu lances trois fois cette application (dont une fois qui ne sert à rien pour g++ cl.h, mais bon... c'est pas le plus grave):
    A chaque fois que tu "relances l'application", elle a "oublié" tout ce qu'elle a pu faire lors de ces exécutions précédentes

    Mais c'est normal : imagines un peu le foutoir que cela ferait si elle devait se rappeler de tous les fichiers qu'elle a pu compiler depuis qu'elle est installée, dont des projets entiers
    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

    Homme Profil pro
    Apprenti
    Inscrit en
    décembre 2010
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : décembre 2010
    Messages : 86
    Points : -1
    Points
    -1

    Par défaut

    Moi, je pensais que quand je faisais g++ cl.cpp puis enfin g++ monmain.cpp séparément, le résultat de g++ cl.cpp était mémorisé quelque part en attendant l'éxécution de monmain.cpp

    Je trouve ça curieux, que comme il vient d'être rappelé, tout est oublié à chaque éxécution de g++.

    Mais ça semble cohérent en y pensant bien, car si il y a de gros projets, et que des choses ont été modifiées ici où là, la dépendance des fichiers ça et là, pourrait tout perturber.

    D'où l'idée du make probablement qui permet de tout mettre en lien et revérifier la cohérence.

  18. #18
    Modérateur
    Avatar de koala01
    Profil pro Philippe Dunski
    Inscrit en
    octobre 2004
    Messages
    9 686
    Détails du profil
    Informations personnelles :
    Nom : Philippe Dunski
    Âge : 42

    Informations forums :
    Inscription : octobre 2004
    Messages : 9 686
    Points : 15 737
    Points
    15 737

    Par défaut

    Citation Envoyé par matlab_ Voir le message
    Moi, je pensais que quand je faisais g++ cl.cpp puis enfin g++ monmain.cpp séparément, le résultat de g++ cl.cpp était mémorisé quelque part en attendant l'éxécution de monmain.cpp

    Je trouve ça sérieux, que comme il vient d'être rappelé, tout est oublié à chaque éxécution de g++.

    Mais ça semble cohérent en y pensant bien, car si il y a de gros projets, et que des choses ont été modifiées ici où là, la dépendance des fichiers ça et là, pourrait tout perturber.

    D'où l'idée du make probablement qui permet de tout mettre en lien et revérifier la cohérence.
    En fait, l'idée des make et autres systèmes similaires, c'est de créer les fichiers objets (comprends : les fichiers qui contiennent le code binaire exécutable) de tous les fichiers *.cpp, puis de passer le relais à l'éditeur de liens sous la forme d'un grand <editeurDeLien> -c *.o -o tonProgramme.exeIl faut aussi savoir que g++ est en fait un "frontend", c'est à dire un programme qui va, lui-même, appeler d'autres programmes (ld qui est l'éditeur de lien par défaut dans le cas présent )
    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

    Homme Profil pro
    Apprenti
    Inscrit en
    décembre 2010
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : décembre 2010
    Messages : 86
    Points : -1
    Points
    -1

    Par défaut

    je voulais dire: je trouve ça curieux, j'ai modifié mon précédent post.

    merci

    Si je comprends, c'est donc ld qui crée le fichier -o ? et g++ appelle ld ?

  20. #20
    Membre Expert
    Avatar de white_tentacle
    Inscrit en
    novembre 2008
    Messages
    1 284
    Détails du profil
    Informations forums :
    Inscription : novembre 2008
    Messages : 1 284
    Points : 1 771
    Points
    1 771

    Par défaut

    C’est bien cela.

    L’avantage est que g++ t’ajoutes automatiquement toutes les librairies standard c++ quand il appelle ld, t’évitant de le faire toi-même.

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •