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 :

Petit problème avec le constructeur par copie


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut Petit problème avec le constructeur par copie
    Bonjour tout le monde,

    J'ai un programme sur lequel je suis bloqué depuis hier soir.

    J'ai en fait deux erreurs dans la même fonction :

    error C2661: 'CVoiture::CVoiture' : no overloaded function takes 2 parameters
    et

    error C2661: 'CVoiture::CVoiture' : no overloaded function takes 2 parameters
    La méthode Ajouter prend un seul paramètre qui est un modele de voiture, modele veut dire un tout qui fait une voiture:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool CTabVoitures::Ajouter(const CVoiture& Modele)
    Je pense que cette fonction reçoit le model via le constructeur par copie que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	CVoiture(const CVoiture& Source);
    Je vous remercie d'avance pour votre so precious.

    beegees

    PS: voici le code des deux fonctions qui pour moi posent problème

    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
    #include "chaine.h"
     
     
    class Vehicule3
    {
    public:
     
    	Vehicule3();
    	~Vehicule3();
     
     
     
    	short		NombreDePlace;
    	bool		Nom(const char* UnNom); //modificateur du nom
    	bool		EstValide() const;
     
     
    private:
    	CChaine		m_Nom;
    	CChaine		m_Immatriculation;
     
    };
     
    class CVoiture : public Vehicule3
    {
    public:
    	CVoiture();
    	CVoiture(const CVoiture& Source);
    	~CVoiture();
     
    	bool				EstValide() const;
     
     
    private:
    	double		m_VTM; //Volume transportable de marchandise
     
     
    };
     
    class CTabVoitures
    {
    public:
    	CTabVoitures();
    	~CTabVoitures();
    	bool				Ajouter(const CVoiture& Modele);
    	long				Indice(const char* Nom) const;
    private:
    	long				m_Nombre;
    	CVoiture**			m_Tableau;
     
    };
     
    class CLeTout
    {
    public:
    	CLeTout();
    	~CLeTout();
     
    	bool		Charger(const char* NomFichier);
     
    private:
     
    	private:
    	static bool			FctnTraiterLigne(const CChargeurFichierTexte& CC, void* Contexte);
    	bool				TraiterLigne(const CChargeurFichierTexte& CC);
     
     
    private:
    	CTabVoitures	m_TV; //Tableau de voitures
    };
    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
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    #include <BasicConsole.h>
    #include "vehicule3.h"
    #include "chaine.h"
     
    FctnTraiterLigne(const CChargeurFichierTexte& CC, void* Contexte);
     
     
    Vehicule3::Vehicule3()
    :NombreDePlace(0)
    {
    }
     
    Vehicule3::~Vehicule3()
    {
    }
     
    CVoiture::CVoiture()
    :m_VTM(0.0)
    {
    }
     
    CVoiture::~CVoiture()
    {
    }
     
    CTabVoitures::CTabVoitures()
    :m_Nombre(0),m_Tableau(NULL)
    {
    }
     
    CTabVoitures::~CTabVoitures()
    {
    }
     
    CLeTout::CLeTout()
    {
     
    }
     
    CLeTout::~CLeTout()
    {
     
    }
     
    bool	CLeTout::Charger(const char* NomFichier)
    {
     
    	CChargeurFichierTexte	Chargeur;
     
     
    	return Chargeur.Charger(NomFichier,'\t',CLeTout::FctnTraiterLigne,this);
    }
     
    bool CLeTout::FctnTraiterLigne(const CChargeurFichierTexte& CC, void* Contexte)
    {
    	return ((CLeTout*)Contexte)->TraiterLigne(CC);
    }
     
    	bool CLeTout::TraiterLigne(const CChargeurFichierTexte& CC)
    	{
    		if (strlen(CC.Champs(0)) == 1) switch (CC.Champs(0)[0])
    		{
    			case 'R':
    				if (CC.NombreChamps() == 4) m_TV.Ajouter(CVoiture(CC.Champs(1),CC.Champs(2)),CC.Champs(3),CC.Champs(4));
    				break;
    		}
    		return true;
    	}
     
     
    bool CTabVoitures::Ajouter(const CVoiture& Modele)
    {
    	if (!Modele.EstValide()) return false;
    	//if (Indice(Modele.Nom()) >= 0) return true;
    	CVoiture* AAjouter = new CVoiture(Modele);
    	if (AAjouter == NULL) return false;
    	void* Nouveau = realloc(m_Tableau,(m_Nombre+1)*sizeof(CVoiture*));
    	if (Nouveau == NULL)
    	{
    		delete AAjouter;
    		return false;
    	}
    	m_Tableau = (CVoiture**)Nouveau;
    	m_Tableau[m_Nombre] = AAjouter;
    	m_Nombre++;
    	return true;
    }
     
    bool CVoiture::EstValide() const
    {
    	return (Vehicule3::EstValide()) && (m_VTM > 0);
    }
     
    bool Vehicule3::EstValide() const
    {
    	return !m_Nom.EstVide();
    }

  2. #2
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Salut,

    dans le cpp, je ne vois la définition de la fonction CVoiture(const CVoiture& Source)

    Sinon à quelle ligne est ton erreur? Est-ce quand tu appelles une certaine fonction?
    etc..

    En tout cas c'est hallucinant la vitesse à laquelle tu avances

  3. #3
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut
    Salut Coyotte,

    Merci pour ta réponse.

    En effet, j'ai oublié le principal, je m'en excuse

    Les deux erreurs de produisent sur cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (CC.NombreChamps() == 4) m_TV.Ajouter(CVoiture(CC.Champs(1),CC.Champs(2)),CC.Champs(3),CC.Champs(4));
    J'ai créé le constructeur par copie dans Vehicule3.cpp car je l'avais pas fait, bien vu

    Par contre, je vais t'avouer que je ne comprends pas bien ce constructeur par copie.

    Dois-je initialiser les membres de la classe (m_....) ?

    Voici ce que j'ai fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CVoiture::CVoiture(const CVoiture& Source)
    :Vehicule3(Source)
    {
    }
    Voici une partie de l'énoncé (celui se rapportant à une voiture) :

    - un véhicule peut être une voiture, un camion ou un bus
    - un véhicule est défini par :
    - une immatriculation
    - un nombre de places (places assises pour des personnes)
    - une voiture est caractérisée en plus par :
    - un volume transportable de marchandises
    et voici le fichier txt que je lis :

    B ABBA54 50 25
    C CPP40M 2 3000
    V HUB345 5 200
    Merci 100000000000 fois pour ton aide vraiment très précieuse.

    beegees

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Le message d'erreur est pourtant clair (pour une fois, autant en profiter) puisque tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CVoiture(CC.Champs(1),CC.Champs(2))
    Ce qui ne correspond à aucun constructeur puisque le seul qui existe est le constructeur par défaut qui ne prend pas d'argument.

    Ton problème n'a rien à voir avec le constructeur par copie.
    Tu peux regarder dans la FAQ, il y a toute une partie sur les constructeurs.

    MAT.

  5. #5
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    Salut,

    Le message d'erreur est pourtant clair (pour une fois, autant en profiter) puisque tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CVoiture(CC.Champs(1),CC.Champs(2))
    Ce qui ne correspond à aucun constructeur puisque le seul qui existe est le constructeur par défaut qui ne prend pas d'argument.

    Ton problème n'a rien à voir avec le constructeur par copie.
    Tu peux regarder dans la FAQ, il y a toute une partie sur les constructeurs.

    MAT.

    Salut Mat,

    Merci pour ta réponse.


    J'ai ajouté un constructeur par copie que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CVoiture::CVoiture(const CVoiture& Source)
    :Vehicule3(Source)
    {
    }
    mais ici il y'a les objets qui se trouve dans la classe Vehicule3 que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CChaine		m_Nom;
    	CChaine		m_Immatriculation;
    	short		m_NombreDePlaces;
    Enfin je pense...

    Et ensuite je dois ajouter les objets qui sont propres à une voiture comme le volume transportable ?

    Merci d'avance pour ta réponse.

    beegees

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu ne peux pas régler directement les champs si tu ne fais pas un constructeur qui les prend en paramètre.
    Typiquement, tu vas devoir ajouter un ou plusieurs constructeurs et Vehicule3 et CVoiture...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/06/2011, 23h36
  2. problème avec le constructeur de copie
    Par ikuzar dans le forum Débuter
    Réponses: 14
    Dernier message: 02/02/2011, 17h26
  3. Réponses: 5
    Dernier message: 04/04/2008, 00h14
  4. Réponses: 10
    Dernier message: 29/10/2007, 14h15
  5. [Debutant] Problème avec un constructeur par copie
    Par Drannor dans le forum Débuter
    Réponses: 5
    Dernier message: 12/03/2007, 09h15

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