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 :

problème avec constructeur


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    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
    Invité
    Invité(e)
    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
    Membre confirmé
    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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    On va mettre ça sur le coup de la fatigue et de la grippe

  6. #6
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 293
    Billets dans le blog
    2
    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
    Membre confirmé
    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
    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
    Membre confirmé
    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
    Par défaut question corrigé examen
    Bonjour dans le corrigé de cet exam. joint en pdf,

    page 3/4

    question 2 :

    voici la question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int *i = new int[6]; //Question i
    A la suite de cette ligne, on peut écrire   F
    if (i != NULL)
          i = 4;
    A la suite de cette ligne, on peut écrire V
    if (i != NULL)
          i[0] = 4;
    A la suite de cette ligne, on peut écrire   F
    if (i != NULL)
          i[6] = 4;
    A la suite de cette ligne, on peut écrire   F
    if (i != NULL)
          i[] = {1, 2, 3, 4, 5, 6};

    je ne saisis pas le "vrai" pour la deuxième proposition.

    en effet i est un pointeur sur un entier , n'est-ce pas ?

    Donc , d'après ce que je sais, il faut utiliser pour désigner des valeurs alors que i tout seul désignerait des adresses ? ou bien ce serait pour désigner l'adresse de ?

    Dans ce cas, pourquoi peut-on écrire, alors que à ma connaissance i[0] désignerait plutôt des adresses ?


    Merci de vos explications

    ps: d'ailleurs, dans ce code, on a un ce qui montre bien que la valeur de i est une adresse
    Images attachées Images attachées

  9. #9
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Encore une fois, la seule date à laquelle a été présenté cet examen tend à le disqualifier si tu veux avoir une chance d'apprendre du C++ un tout petit peu moderne.

    En datant de 2000, il a pris du retard sur deux versions de la norme et sur un technical report ce qui est, vraiment, très important.

    Quand on sait qu'en plus les profs sont très lents à se mettre à jour...

    Ceci dit:
    je ne saisis pas le "vrai" pour la deuxième proposition.

    en effet i est un pointeur sur un entier , n'est-ce pas ?

    Donc , d'après ce que je sais, il faut utiliser
    pour désigner des valeurs alors que i tout seul désignerait des adresses ? ou bien ce seraitpour désigner l'adresse de
    Oui, mais non...

    C'est, quelque part, tout le problème des pointeurs...

    Le fait est que i n'est jamais qu'un pointeur. C'est à dire une variable qui contient l'adresse mémoire à laquelle on va trouver un élément du type indiqué.

    Mais l'adresse contenue par i est l'adresse qui résulte de new int[6]. Or, new int[6] a eu comme effet de réserver l'espace mémoire suffisant pour pouvoir représenter 6 éléments de type int consécutifs et le résultat est l'adresse du premier élément (celui à l'index 0).

    Tu peux donc tout à fait sans problème travailler "comme bon te semble":
    fonctionnera en assignant la valeur 4 à "ce qui est pointé par i" et qui correspond à l'élément d'index 0, mais cela aura exactement le même résultat que
    car l'opérateur [] a pour résultat de dire "prend ce qui se trouve à l'adresse de i et décales toi du nombre d'éléments indiqué entre les crochets" ce qui correspond bel et bien à la même chose

    Ce qui est vrai, c'est que tu peux effectivement envisager de passer un array lorsqu'un pointeur est attendu sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /* soient 
    void foo(int * tab)
    et 
    void bar(int tab[4])
    */
    int main()
    {
       int i[4];
       foo(i); // ok : i est bel et bien un pointeur sur le premier élément
       bar(i); // ok : i est bel et bien un array de 4 entiers
    }
    Par contre, tu ne peux pas envisager de passer un pointeur quand un array est attendu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    /* soient 
    void foo(int * tab)
    et 
    void bar(int tab[4])
    */
    int main()
    {
       int * i = new int[4];
       foo(i); // ok : i est bel et bien un pointeur sur le premier élément
       bar(i); // nok : i n'est pas un array mais un pointeur
    }
    ps: d'ailleurs, dans ce code, on a un
    En effet, et alors...

    A ton avis, il s'agit de l'adresse de quoi, selon toi

    Si on a mis ce test, c'est uniquement pour s'assurer de la validité du pointeur, et rien d'autre (bien que le test soit, a priori inutile dans ce cas particulier car il y aurait une exception std::bad_alloc() lancée si l'allocation dynamique avait échoué )
    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

  10. #10
    Membre confirmé
    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
    Par défaut
    Bonjour koala et bonjour à tous,

    je ne connais pas les fonctions bar et foo dans qui apparaissent dans le dernier post de koala.

    Pouvez-vous me dire précisément à quoi elles servent ?

    (d'après ce post, elles vient de std)

    Merci

  11. #11
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par matlab_ Voir le message
    Bonjour koala et bonjour à tous,

    je ne connais pas les fonctions bar et foo dans qui apparaissent dans le dernier post de koala.

    Pouvez-vous me dire précisément à quoi elles servent ?

    (d'après ce post, elles vient de std)
    Pas vraiment...

    Ce sont des noms de fonctions que l'on utilise régulièrement pour signifier "toute fonction qui présenterait une signature similaire"

    c'est comme si on les avait nommées "faitQuelqueChose" et "faitAutrechose"
    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

  12. #12
    Membre confirmé
    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
    Par défaut
    Bonsoir,

    je n'ai toujours pas compris ce que signifient bar et foo.

    merci de vos explications

    cordialement

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

Discussions similaires

  1. Problème avec constructeurs
    Par MS181 dans le forum Débuter
    Réponses: 5
    Dernier message: 30/04/2013, 18h32
  2. problème avec pointeur et constructeur
    Par matteli dans le forum C++
    Réponses: 2
    Dernier message: 24/02/2008, 16h11
  3. [Debutant] Problème avec un constructeur par copie
    Par Drannor dans le forum Débuter
    Réponses: 5
    Dernier message: 12/03/2007, 09h15
  4. problème de constructeur avec wxWidget
    Par Ardeciel dans le forum wxWidgets
    Réponses: 2
    Dernier message: 10/03/2007, 23h11
  5. [Conception]Problèmes avec un constructeur dérivé
    Par Le Furet dans le forum Langage
    Réponses: 6
    Dernier message: 10/03/2006, 09h44

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