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 :

erreur : no matching function for call to 'Voiture::Voiture(int, int, int, int, const


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de moniroje
    Homme Profil pro
    retraité
    Inscrit en
    Février 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Février 2006
    Messages : 17
    Par défaut erreur : no matching function for call to 'Voiture::Voiture(int, int, int, int, const
    Bonjour...
    Je suis tout nouveau ici; en train d'apprendre tout seul le C++, hou la galère mais ça me botte.
    N'ai pas osé aussi posé mes questions ici: vous me semblez déjà si forts; alors,
    Bon, mon pb: j'en suis à Classes et héritage et me servir d'un tableau de pointeurs
    et le projet que je monte au fur et à mesure de la leçon, là, il coince; et plus j'essaye de le corriger, moins je comprends...
    Je vais vous passer le main.cpp et les fichiers de la classe-mère; ce doit être suffisant pour que vous releviez mes énormités.... :

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    #include <iostream>
    #include <string>  
    # include <vector> 
    #include "Vehicule.h"
    #include "Voiture.h"
    #include "Moto.h"
    #include "Camion.h"
     
    using namespace std;
     
    int main()
    {
      /* je crée un tableau dynamique de véhicules où je mettrai tous les véhicules dont je dispose en ces trois classes-filles: voitures, motos, camions: */
        vector<Vehicule*> listeVehicules;
    // je mets mes véhicules:
      listeVehicules.push_back (new Voiture(12500,4,2002,150,"Land-Rover", " Tout-terrain ",3, "bleu-nuit"));
      /* A) ci-dessus => erreur: no matching function for call to 'Voiture::Voiture
      (int,int,int,int, const char [11], const char [15], int, const char[10])'
      listeVehicules.push_back (new Voiture(6000,4,2005, 150,"New-Beetle","cabriolet",2, "bleu-nuit,"));
      // même erreur que A)
      listeVehicules.push_back (new Voiture(35000,5,200,2006,"Range-Rover","Premium",5,"blanc"));
      // même erreur A)
      // et rajouter pour les motos la valeur de m_cylindree()
      listeVehicules.push_back (new Moto(1100,2,2010,95,"Kawasaki",125));
      /* erreur A'): idem que A mais avec call to 'Moto::Moto(... plus qu'il dit:
      candidate expects 0 argument, 6 provided */
      listeVehicules.push_back (new Moto(10000,2,2004,150,"Harley-Davidson",2400));
      // erreur A')
      // et rajouter pour les camions int m_tonnage
      listeVehicules.push_back (new Camion(3000,4,2000,130,"Combi-VW",2));
      /* ereur A": idem que A) mais avec call to 'Camion::Camion... plus qu'il dit:
      candidate expects 0 argument, 6 provided... ah bon, il en attend 0? */
      listeVehicules.push_back (new Camion(50000,12,2001,145,"Mercedes",18));
      // erreur A")
     
      // une fois la collection définie, le job par lui-même: 
      int choix(0);
        cout << "Que souhaitez-vous ?" << endl;
        cout << "1. Une moto" << endl;
        cout << "2. Une voiture" << endl;
        cout << "3. Un camion" << endl;
     
        cin >> choix;
     
        switch(choix)
           {
            case 1:
              // Moto
                {
                 // le proto de la méthode affiche est dans Vehicule.h en virtual
                 (listeVehicules[4])-> affiche(); /* utilisation de la fonction
                  * affiche() pour le pointeur de la case 4 qui doit correspondre à la Harley */
                }
              break;
     
          case 2:
              // Voiture
              {
               (listeVehicules[1])->affiche(); // pour la Beetle
              }
              break;
     
          case 3:
              // Camion
              {
               (listeVehicules[6])->affiche(); // le camion Mercedes
              }
              break;
     
          default:
              cout << "Entrée invalide" << endl;
              break;
      }
     
      for (int i(0); i<listeVehicules.size(); ++i) /* attention: comparaison entre
        des expressions entières signée et non signée: ça veut dire quoi, ça ??? */
      {
        delete listeVehicules[i]; 
        /* attention: deleting object of polymorphic class type 'Vehicule' which has
        non virtual-destructor might cause undefined behaviour */
        listeVehicules[i] = 0; // on met le pointeur à zéro
      }
     
      return 0;
    }
    Maintenant le fichier Vehicule.h:

    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
    #ifndef VEHICULE_H_INCLUDED
    #define VEHICULE_H_INCLUDED
     
    class Vehicule 
    {
      public: 
      Vehicule();
     // ci-dessus est le prototype du constructeur d'objets par défaut:
      ~Vehicule(); // le destructeur
      // prototype de la méthode affiche:
      virtual void affiche() const; // description du véhicule
     
      protected: 
        int m_prix; // chaque véhicule a un prix
        int m_nbRoues;
        int m_annee;
        int m_vitesse;
        std::string m_marque;
        // ces attributs déclarés ici seront initialisés par le constructeur
    }; 
     
    #endif // VEHICULE_H_INCLUDED
    puis le fichier-source: Vehicule.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
    16
    17
    18
    19
    20
    21
    22
    #include <iostream> 
    #include "Vehicule.h"
     
    using namespace std;
      // déclarer les variables avec lesquelles seront initialisées les attributs:
      int prix(1000), nbRoues(4), annee(1943), vitesse(200);
      string marque("Panhard") ;
    // ci-dessous le constructeur suivi de sa liste d'initialisations:
    Vehicule::Vehicule():
     m_prix(prix), m_nbRoues(nbRoues), m_annee(annee), m_vitesse(vitesse),m_marque(marque)
    {
    } 
    // après le constructeur, le destructeur:
    Vehicule::~Vehicule()
    {
    }
    // implémentation de la fonction affiche de la classe Vehicule:
    void Vehicule::affiche() const
    {
      cout << "Je suis ce que vous cherchez, pour  " << m_prix << " euros" << endl;
      cout << un(e) << m_marque <<  " de : " << m_annee << endl;
    }
    Les fichiers headers et source des autres classes sont du même acabit; si vous en avez besoin, je les rajouterai.
    Bon, je me doute que j'ai dû commettre quelques crimes... faut dire qu'à chercher où est l'erreur, je comprends de moins en moins ce que je fais...

  2. #2
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Bonjour,

    Ton problème ce trouve lors de la création (allocation mémoire avec le new) de ta voiture.
    Lorsque tu veux construire une instance de ta classe Voiture, tu dois faire appelle à un Constructeur.
    Il en existe plusieurs sortes:
    Le constructeur par défault: tu ne lui donne aucun argument comme par exemple:
    Vehicule.h
    Vehicule.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Vehicule::Vehicule():
     m_prix(1000.0), m_nbRoues(4), m_annee(2013), m_vitesse(250),m_marque("marque")
    {
    }
    Ici déjà tu as une erreur, regarde bien!

    Le constructeur paramétrique: tu lui donne des paramètres:
    Vehicule.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vehicule(int prix, int nbRoues, int anne, intvitesse, std::string marque);
    Vehicule.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Vehicule::Vehicule(int prix, int nbRoues, int annee, int vitesse, std::string marque):
     m_prix(prix), m_nbRoues(nbRoues), m_annee(annee), m_vitesse(vitesse),m_marque(marque)
    {
    }
    Voila celui que tu dois mettre en plus du constructeur par défaut.


    Car Actuellement, tu à dans ton Vehicle.h un constructeur par défaut et dans ton .cpp tu as un constructeur par défaut mais tu initialises tes variables avec des paramètres qui n'existe pas! Donc garde ton constructeur par défaut en mettant de vrai valeur et ajoute un constructeur paramétrique en initialisant les variables avec les paramètres

  3. #3
    Membre averti Avatar de moniroje
    Homme Profil pro
    retraité
    Inscrit en
    Février 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Février 2006
    Messages : 17
    Par défaut
    Bonsoir Astraya et merci de m'avoir répondu si vite!!!
    Moi, si j'ai un peu tardé , en fait il m'a fallu bien réfléchir à ce que tu m'as dit et réviser les constructeurs...
    Voilà :
    Ici déjà tu as une erreur, regarde bien!
    Je regarde, je regarde et je vois que dans .h et dans .cpp, j'appelle le constructeur par défaut: Vehicule(); ensuite l'implémentation de ce constructeur, soit dans Vehicule.cpp, initialise les attributs m_; ben oui, c'est son rôle, non??? Ce que je vois qui ne serait pas bien, ce serait les valeurs mises ici: valeurs bidon que je pensais qui allaient être remplacées par les valeurs mises dans le main par les push_back...

    Car actuellement, tu as dans ton Vehicule.h un constructeur par défaut et dans ton .cpp tu as un constructeur par défaut mais tu initialises tes variables avec des paramètres qui n'existent pas!
    _Ah bon? ces paramètres n'existent pas??? Pourtant j'ai déclaré les variables int prix(1000), nbRoues(4), annee(1943), vitesse(200); string marque("Panhard") ; dans Vehicule.cpp !!!variables que le constructeur par défaut Vehicule() utilise dans Vehicule.cpp pour initialiser les attributs m_correspondants !!

    Tu as de toute façon raison puisque mon projet se casse la gueule... Vais faire comme tu dis... toutefois avec une crainte: il me semble que mon tuto m'ait dit que si héritage, la classe-mère ne doit avoir que le constructeur par défaut... sinon les classes-filles ne sauraient quel constructeur choisir...

  4. #4
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Bonjour,
    Effectivement j'avais pas vu que dans ton .cpp tu déclares globalement prix, nbRoues etc... mais là je te demande pourquoi?? aucune utilité sauf compliquer la tâche, met les directement dans le constructeur.

    Mais sinon c'est quoi ton erreur? erreur de compilation? erreur d’exécution? On peut avoir plus de détails comme la sortie du compilateur ou autre chose qui nous met sur la piste;

    Merci

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Salut,

    Citation Envoyé par moniroje Voir le message
    toutefois avec une crainte: il me semble que mon tuto m'ait dit que si héritage, la classe-mère ne doit avoir que le constructeur par défaut... sinon les classes-filles ne sauraient quel constructeur choisir...
    Fort heureusement, les classes filles peuvent choisir quel constructeur choisir.

    Pour le souci initial
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new Voiture(12500,4,2002,150,"Land-Rover", " Tout-terrain ",3, "bleu-nuit")
    Si tu veux appeler un constructeur avec paramètres, faut qu'il existe.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre averti Avatar de moniroje
    Homme Profil pro
    retraité
    Inscrit en
    Février 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Février 2006
    Messages : 17
    Par défaut chouette, un autre pour m'aider!!!
    Bonjour Bousk!
    Vais réfléchir à ce que tu as dit qui a l'air de correspondre à ce que m'a conseillé Astraya: il me faut un constructeur à paramètres (un constructeur surchargé selon mon bouquin).
    Mais auparavant, je rends compte à Astraya:
    OK, je vais donc déclarer mes variables directement dans le constructeur: voici le fichier Vehicule.cpp remanié:

    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
    #include <iostream> 
    #include "Vehicule.h"
     
    using namespace std;
     
    // ci-dessous le constructeur suivi de sa liste d'initialisations:
    Vehicule::Vehicule():
     m_prix(int prix), m_nbRoues(int nbRoues), m_annee(int annee), m_vitesse(int vitesse),m_marque(string marque)
    {
    } 
    // après le constructeur, le destructeur:
    Vehicule::~Vehicule()
    {
    }
    // implémentation de la fonction affiche de la classe Vehicule:
    void Vehicule::affiche() const
    {
      cout << "Je suis ce que vous cherchez, pour  " << m_prix << " euros" << endl;
      cout << un(e) << m_marque <<  " de : " << m_annee << endl;
    }
    Bon, je relance; et CodeBlocks coince aux mêmes lignes du main.cpp avec le même message:
    par exemple pour le premier push_back qui est:
    listeVehicules.push_back (new Voiture(12500,4,2002,150,"Land-Rover", " Tout-terrain ",3, "bleu-nuit"));

    erreur: no matching function for call to 'Voiture::Voiture (int,int,int,int, const char [11], const char [15], int, const char[10])'
    suivi de ces lignes dont le numéro ne correspond pas et qui doivent être la suite du message d'erreur?:
    note: candidates are:
    note: Voiture::Voiture()
    note: candidate expects 1 argument, 8 provided

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Cela a déjà été dit, mais ne semble pas assimilé...
    Ton souci se situe ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listeVehicules.push_back (new Voiture(12500,4,2002,150,"Land-Rover", " Tout-terrain ",3, "bleu-nuit"));
    et plus exactement cette partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new Voiture(12500,4,2002,150,"Land-Rover", " Tout-terrain ",3, "bleu-nuit")
    Que nous dit l'erreur ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    no matching function for call to Voiture::Voiture (int,int,int,int, const char [11], const char [15], int, const char[10])
    Le compilateur ne trouve donc aucune méthode ayant la signature suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Voiture::Voiture (int,int,int,int, const char [11], const char [15], int, const char[10])
    les tableaux de char pouvant être remplacés par des std::string car il existe un constructeur de std::string prenant un const char * en paramètre, il ne trouve donc aucun constructeur de Voiture de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Voiture (int,int,int,int, std::string, std::string, int, std::string)
    et pour cause ! On n'y retrouve que
    note: candidates are:
    note: Voiture::Voiture()
    qui lui n'attend aucun argument et non 8
    note: candidate expects 0 argument, 8 provided 
    L'autre constructeur (tu as dû couper ton message d'erreur) est le constructeur par copie défini implicitement par le compilateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Voiture::Voiture(const Voiture &)
    qui lui attendrait une Voiture, soit un argument et non toujours 8.
    note: candidate expects 1 argument, 8 provided 
    Ton autre grosse erreur se trouve ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Vehicule::Vehicule():
     m_prix(int prix), m_nbRoues(int nbRoues), m_annee(int annee), m_vitesse(int vitesse),m_marque(string marque)
    {
    }
    Ceci est totalement faux. Ces déclarations n'ont absolument pas leur place ici. Il te faut passer les valeurs en paramètre de ton constructeur, et ce sont ces valeurs passées en paramètre que tu donnes à tes membres pour les initialiser correctement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Vehicule(int prix, int nbRoues, int annee, int vitesse, string marque) 
      : m_prix(prix)
      , m_nbRoues(nbRoues)
      , m_annee(annee)
      , m_vitesse(vitesse)
      , m_marque(marque)
    {
    }
    C'est en ayant défini ce constructeur Vehicule prenant 5 arguments, et seulement à cette condition que tu pourras effectuer un appel de cette forme avec 5 arguments (pas plus pas moins et avec les mêmes types) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new Vehicule(1000, 4, 2013, 250, "marque")
    Une dernière erreur d'étourderie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << "un(e)" << m_marque <<  " de : " << m_annee << endl;

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/01/2012, 14h34
  2. Réponses: 2
    Dernier message: 05/08/2011, 18h13
  3. No matching function for call to 'Joueur::Joueur'
    Par Go'Gaule dans le forum Débuter
    Réponses: 4
    Dernier message: 02/07/2011, 07h50
  4. Réponses: 8
    Dernier message: 09/07/2010, 16h02
  5. no matching function for call
    Par pimousse280187 dans le forum Linux
    Réponses: 1
    Dernier message: 06/06/2009, 21h08

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