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 l'utilisation d'un constructeur surchargé


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2014
    Messages : 13
    Points : 5
    Points
    5
    Par défaut Problème avec l'utilisation d'un constructeur surchargé
    Bonjour à tous,

    Je fais un jeu de carte en c++ et j'ai donc construit divers classes : une classe carte, une classe paquet de carte (qui herite de carte),une classe Joueur et une classe Jeu.

    J'ai construit ma classe Carte de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     //constructeur
     
    Carte::Carte(unsigned int valeur,unsigned int couleur):m_valeur(valeur), m_couleur(couleur),m_face(true)
        {
     
        }
    Ma classe Paquet de carte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Paquet::Paquet()
    {
        for(unsigned int i(0);i<52;i++)
        {
            m_cartesPaquet.reserve(52);
            // les cartes sont classees en 4 couleurs avec des valeurs allant de 1 a 13
            m_cartesPaquet.push_back(Carte(i%13+1,(i/13)+1));
     
        }
    }
    Où l'attribut m_cartesPaquet est declaré comme un vector de carte de le .h

    Lorsque je compile j'ai un problème où au lieu d'appeler mon constructeur surchargé mon programme appelle un constructeur par défaut qu'il ne trouve pas puisque j'ai juste mon constructeur surchargé.

    Je crois que l'erreur vient de cette méthode de ma classe Joueur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       void Joueur::recevoirCartes(Carte carteJ)
    {
            m_cartesJoueur.push_back(carteJ);
    }
    Dois je placer des arguments quelque part afin que ma carteJ soit correctement instanciée ou cette syntaxe est elle correcte avec mon constructeur qui en théorie prend 2 arguments ?

    J'ai un petit peu de mal à bien concevoir mes constructeurs pour le moment je débute en c++ et je vois bien l’intérêt de la surcharge mais ne la maitrise pas vraiment.

    Merci d'avance pour vos réponses

  2. #2
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 94
    Points : 122
    Points
    122
    Par défaut
    Salut !

    Tu peux nous copier/coller les erreurs de compilation que tu obtiens ?

    Au passage: fais ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_cartesPaquet.reserve(52);
    au moins avant la boucle, dans ton cas c'est inutile de le faire à chaque fois si je comprends bien.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2014
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Oui je devais bien le placer avant la boucle mon .reserve sinon comme message d'erreur j'ai ceci :


    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
    Joueur.cpp||In member function 'void Joueur::calculerScore()':|
     
    Paquet.cpp||In constructor 'Paquet :: Paquet()':
    Paquet.cpp|9|error: no matching function for call to 'Carte::Carte()'
    Paquet.cpp|9|note: candidates are:
     
    include\Carte.h|9|note: Carte::Carte(unsigned int, unsigned int)
    include\Carte.h|9|note:   candidate expects 2 arguments, 0 provided
    include\Carte.h|5|note: constexpr Carte::Carte(const Carte&)
    include\Carte.h|5|note:   candidate expects 1 argument, 0 provided
     
    Paquet.cpp||In member function 'Carte Paquet::distribuer()':
    Paquet.cpp|30|error: no matching function for call to 'Carte::Carte()'
    Paquet.cpp|30|note: candidates are:
     
    include\Carte.h|9|note: Carte::Carte(unsigned int, unsigned int)
    include\Carte.h|9|note:   candidate expects 2 arguments, 0 provided
    include\Carte.h|5|note: constexpr Carte::Carte(const Carte&)
    include\Carte.h|5|note:   candidate expects 1 argument, 0 provided
    ||=== Build finished: 2 errors, 0 warnings (0 minutes, 0 seconds)

  4. #4
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 958
    Points
    32 958
    Billets dans le blog
    4
    Par défaut
    Bonjour,
    Citation Envoyé par namklaw Voir le message
    une classe paquet de carte (qui herite de carte)
    sans lire plus loin, si c'est vrai, ceci montre déjà un gros problème de conception.

    Rappel, l'héritage c'est une relation est un
    Un paquet est une carte ?

    Pense aux références pour les paramètres.

    Quelle est la ligne 9 du paquet.cpp ?
    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.

  5. #5
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par namklaw Voir le message
    Je fais un jeu de carte en c++ et j'ai donc construit divers classes : une classe carte, une classe paquet de carte (qui herite de carte),une classe Joueur et une classe Jeu.
    Hello,

    Un paquet de cartes N'EST PAS une carte, mais il possède des cartes.
    Paquet ne doit pas hériter de Carte.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2014
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    La ligne 9 du Paquet.ccp correspond à la déclaration du constructeur de Paquet :

    Quand à l'héritage c'est vrai qu'il serait plus logique d'avoir carte qui hérite de Paquet car une carte est un paquet de longueur 1 en théorie mais comme j'ai déclaré Paquet comme étant un vecteur de cartes ça me paraissait compliqué. Ou sinon je fais une classe à part ? En fait ce que je voudrais faire c'est quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_cartesPaquet[i].getValeurCarte();
    Pour récupérer la valeur de la ieme carte de mon paquet est ce correct ?

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2014
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Iradrille Voir le message
    Hello,

    Un paquet de cartes N'EST PAS une carte, mais il possède des cartes.
    Paquet ne doit pas hériter de Carte.
    Merci iradrille mais dans ce cas je fais juste une classe à part ? Pour le moment mon header était le suivant j’enlève donc juste le lien d'héritage et cela devient bon ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Paquet : public Carte
    {
        public:
            Paquet();
            //Paquet(int totalCartes);constructeur surchargé pour cree le sabot (6 paquet de partes)
            ~Paquet();
            void melanger();
            Carte distribuer();//nombre de cartes distribuees à un joueur
            void couper();
            void initialiserPaquet();
        private:
     
          std :: vector <Carte> m_cartesPaquet;
    };

  8. #8
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par namklaw Voir le message
    Quand à l'héritage c'est vrai qu'il serait plus logique d'avoir carte qui hérite de Paquet car une carte est un paquet de longueur 1 en théorie.


    Remplace Paquet par "camion qui transporte des cartons" et Carte par "carton".

    Si Camion hérite de Carton (=> Paquet hérite de Carte), cela veut dire qu'un camion est un carton : ça n'a pas de sens.
    Si Carton hérite de Camion (=> Carte hérite de Paquet), cela veut dire qu'un carton est un camion : pas beaucoup plus de sens.

    C'est pas parce que l'héritage est possible qu'il faut vouloir le caser partout.

    edit :
    Citation Envoyé par namklaw Voir le message
    Merci iradrille mais dans ce cas je fais juste une classe à part ?
    Oui, ces deux classes représentent des choses différentes et ne doivent pas être liées par une relation d'héritage.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2014
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Ok je comprends bien qu'il ne faut pas faire n'importe quoi avec l'héritage maintenant ^^'. Par contre je reste bloqué sur mon problème de surcharge de constructeur et également est il possible d'utiliser une telle syntaxe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_score+=m_cartesJoueur[i].getValeurCarte();
    j'utilise cette ligne dans ma méthode calcul du score du joueur dans ma classe Joueur où m_score est un attribut entier et m_cartesJoueur est un vecteur de carte donc en théorie m_cartesJoueur[i] me renvoie bien une carte et je peux utiliser la méthode getValeurCarte de ma classe carte non ?

  10. #10
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    À priori ton raisonnement est bon. Quelle est l'erreur ?

    Ton erreur initiale était parce qu'il manquait le constructeur par défaut et que, quelque part, tu essayais de construire par défaut une carte (donc d'appeler le constructeur sans argument, peut-être implicitement et c'est pourquoi tu ne t'en serais pas rendu compte).

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2014
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    En fait cette ligne marche bien mais c'est dans mon main que j'ai eu un problème où j'utilise une ligne de la forme :

    avec game une instance de ma classe Jeu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    game.getJeuDeCartes()[i].getValeurCarte()
    avec les méthodes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int Carte ::getValeurCarte() const
    {
        return m_valeur;
    }
    où m_valeur est un attribut de carte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Paquet Jeu:: getJeuDeCartes() const
    {
        return m_jeuDeCartes;
    }
    Où Jeu est une classe avec un attribut m_jeuDeCartes qui est un Paquet et Paquet est lui meme est une classe qui a un attribut m_cartesPaquets qui est un vecteur de cartes.
    Le problème c'est que mon compilateur me dit qu'il ne reconnait pas l’opérateur [] en effet j'ai le message d'erreur suivant:

    error: no match for 'operator[]' in 'Jeu::getJeuDeCartes() const()[k]

    En théorie l'operateur ne devrait pas être recherché dans la classe Jeu puisque getJeuDeCartes renvoie un Paquet qui est un vecteur de carte donc je pourrai en théorie acceder à mes cartes de la même manière que dans un vecteur classique non ? Ou alors je dois effectuer une surcharge de l'opérateur [] ? mais si je dois faire une surcharge ou doit elle etre effectuée (et comment ^^') ?

  12. #12
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 958
    Points
    32 958
    Billets dans le blog
    4
    Par défaut
    L'erreur initiale est simple :
    Paquet est une Carte
    L'appel au constructeur d'une classe apelle les constructeurs de classes mères, implicitement leur constructeur par si aucun n'est explicitement appelé dans la liste d'initialisation (je ne sais pas si ça s'applique au constructeur par copie/move pour les constructeurs copie/move de la classe fille)

    Carte n'a pas de constructeur par défaut


    Mais vu que cet héritage est de toutes façons un non-sens complet, ça a surtout permis d'arrêter la casse ici avant que tu ailles plus/trop loin dans ton projet
    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.

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2014
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    ok merci beaucoup pour vos réponses je vais enlever l'héritage et poursuivre mon projet en repensant sa conception

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

Discussions similaires

  1. Problème avec l'utilisation de LogMessage
    Par vanquish dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 17/11/2005, 11h18
  2. Problème avec l'utilisation d'un module
    Par goblin dans le forum Modules
    Réponses: 4
    Dernier message: 09/11/2005, 21h55
  3. Problème avec l'utilisation de librairies
    Par Aradesh dans le forum MFC
    Réponses: 3
    Dernier message: 01/08/2005, 16h00
  4. [debutant] problème avec type à utiliser
    Par mlequim dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 15/07/2005, 17h08
  5. Problème avec l'utilisation de la fonction clock
    Par Matgic95 dans le forum C++Builder
    Réponses: 13
    Dernier message: 09/05/2005, 20h27

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