Précédent   Forum du club des développeurs et IT Pro > C et C++ > C++ > Débuter
Débuter Forum d'entraide pour débuter en langage de programmation C++. Avant de poster : cours d'initiation au C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 09/01/2013, 15h40   #1
humanite
 
Homme
Apprenti
Inscription : décembre 2010
Messages : 81
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Apprenti

Informations forums :
Inscription : décembre 2010
Messages : 81
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 :

Citation:
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
humanite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 15h50   #2
gbdivers
Expert Confirmé Sénior

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

Informations professionnelles :
Activité : Biochimiste
Secteur : Santé

Informations forums :
Inscription : novembre 2008
Messages : 5 318
Points : 19 564
Points : 19 564
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
__________________
Vous souhaitez rejoindre l'équipe de bénévoles qui fait vivre Developpez (traduction, rédaction, modération) ? Contactez moi par MP.

Ma page personnelle avec la liste de mes articles - Mon blog sur le C++, Qt et les GPU.

Je suis régulièrement sur le chat pour les questions C++/Qt.

Apprendre Qt 5 : vidéos d'installation (YouTube), extraites du livre Créer des applications avec Qt 5.
gbdivers est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/01/2013, 15h55   #3
galerien69
Membre chevronné
 
Homme
F5(){F5}
Inscription : avril 2008
Messages : 450
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 : 450
Points : 689
Points : 689
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.
galerien69 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/01/2013, 16h07   #4
humanite
 
Homme
Apprenti
Inscription : décembre 2010
Messages : 81
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Apprenti

Informations forums :
Inscription : décembre 2010
Messages : 81
Points : -1
Points : -1
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)
humanite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 16h08   #5
gbdivers
Expert Confirmé Sénior

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

Informations professionnelles :
Activité : Biochimiste
Secteur : Santé

Informations forums :
Inscription : novembre 2008
Messages : 5 318
Points : 19 564
Points : 19 564
On va mettre ça sur le coup de la fatigue et de la grippe
__________________
Vous souhaitez rejoindre l'équipe de bénévoles qui fait vivre Developpez (traduction, rédaction, modération) ? Contactez moi par MP.

Ma page personnelle avec la liste de mes articles - Mon blog sur le C++, Qt et les GPU.

Je suis régulièrement sur le chat pour les questions C++/Qt.

Apprendre Qt 5 : vidéos d'installation (YouTube), extraites du livre Créer des applications avec Qt 5.
gbdivers est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/01/2013, 16h17   #6
r0d
Expert Confirmé Sénior
 
Inscription : août 2004
Messages : 3 673
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : août 2004
Messages : 3 673
Points : 4 436
Points : 4 436
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.
r0d est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/01/2013, 16h33   #7
humanite
 
Homme
Apprenti
Inscription : décembre 2010
Messages : 81
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Apprenti

Informations forums :
Inscription : décembre 2010
Messages : 81
Points : -1
Points : -1
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.
humanite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 16h34   #8
r0d
Expert Confirmé Sénior
 
Inscription : août 2004
Messages : 3 673
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : août 2004
Messages : 3 673
Points : 4 436
Points : 4 436
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.
r0d est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/01/2013, 17h06   #9
Lintel-oo
Membre habitué
 
Homme
Étudiant
Inscription : avril 2011
Messages : 239
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 239
Points : 128
Points : 128
Citation:
Code :
 undefined reference to `Q::Q(int, int)'
Comme le dit rOd :
Citation:
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.
Lintel-oo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/01/2013, 17h11   #10
white_tentacle
Membre Expert
 
Avatar de white_tentacle
 
Inscription : novembre 2008
Messages : 973
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 973
Points : 1 180
Points : 1 180
C’est une erreur de l’éditeur de lien

Citation:
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.
white_tentacle est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/01/2013, 17h27   #11
humanite
 
Homme
Apprenti
Inscription : décembre 2010
Messages : 81
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Apprenti

Informations forums :
Inscription : décembre 2010
Messages : 81
Points : -1
Points : -1
J'utilise un terminal et lignes de commande

g++ cl.h
g++ cl.cpp
g++ fichiermain.cpp
humanite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 21h45   #12
white_tentacle
Membre Expert
 
Avatar de white_tentacle
 
Inscription : novembre 2008
Messages : 973
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 973
Points : 1 180
Points : 1 180
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à).
white_tentacle est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/01/2013, 22h11   #13
humanite
 
Homme
Apprenti
Inscription : décembre 2010
Messages : 81
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Apprenti

Informations forums :
Inscription : décembre 2010
Messages : 81
Points : -1
Points : -1
Dans le main, j'avais mis : #include "cl.h"

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

merci
humanite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 22h34   #14
white_tentacle
Membre Expert
 
Avatar de white_tentacle
 
Inscription : novembre 2008
Messages : 973
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 973
Points : 1 180
Points : 1 180
-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.
white_tentacle est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/01/2013, 22h42   #15
humanite
 
Homme
Apprenti
Inscription : décembre 2010
Messages : 81
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Apprenti

Informations forums :
Inscription : décembre 2010
Messages : 81
Points : -1
Points : -1
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
humanite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2013, 04h42   #16
koala01
Modérateur
 
Avatar de koala01
 
Philippe Dunski
Inscription : octobre 2004
Messages : 8 629
Détails du profil
Informations personnelles :
Nom : Philippe Dunski
Âge : 41

Informations forums :
Inscription : octobre 2004
Messages : 8 629
Points : 13 354
Points : 13 354
Envoyer un message via MSN à koala01 Envoyer un message via Skype™ à koala01
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
je ne répondrai à aucune question technique par E-mail, message visiteur ou message privé
Vous avez obtenu votre réponse pensez au bouton en bas de page
koala01 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/01/2013, 12h58   #17
humanite
 
Homme
Apprenti
Inscription : décembre 2010
Messages : 81
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Apprenti

Informations forums :
Inscription : décembre 2010
Messages : 81
Points : -1
Points : -1
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.
humanite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2013, 13h27   #18
koala01
Modérateur
 
Avatar de koala01
 
Philippe Dunski
Inscription : octobre 2004
Messages : 8 629
Détails du profil
Informations personnelles :
Nom : Philippe Dunski
Âge : 41

Informations forums :
Inscription : octobre 2004
Messages : 8 629
Points : 13 354
Points : 13 354
Envoyer un message via MSN à koala01 Envoyer un message via Skype™ à koala01
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
je ne répondrai à aucune question technique par E-mail, message visiteur ou message privé
Vous avez obtenu votre réponse pensez au bouton en bas de page
koala01 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/01/2013, 13h29   #19
humanite
 
Homme
Apprenti
Inscription : décembre 2010
Messages : 81
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Apprenti

Informations forums :
Inscription : décembre 2010
Messages : 81
Points : -1
Points : -1
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 ?
humanite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2013, 14h27   #20
white_tentacle
Membre Expert
 
Avatar de white_tentacle
 
Inscription : novembre 2008
Messages : 973
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 973
Points : 1 180
Points : 1 180
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.
white_tentacle est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 06h12.


 
 
 
 
Partenaires

Hébergement Web