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++

  1. #1
    Membre éprouvé
    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 : 48
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    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 expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    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 éprouvé
    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 : 48
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    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 expérimenté

    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
    Points : 1 543
    Points
    1 543
    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 éprouvé
    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 : 48
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    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.

  7. #7
    Membre éprouvé
    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 : 48
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    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...
    Bonjour Médinoc,

    En effet, tu as raison, j'ai ajouté un autre constructeur pour la classe Vehicule3 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Vehicule3::Vehicule3(const Vehicule3& Source) //constructeur par copie de CVehicule3
    :m_Immatriculation(Source.m_Immatriculation),m_NombreDePlaces(Source.m_NombreDePlaces)
    {
    }
    J'ai 4 erreurs maintenant :

    function '__thiscall Vehicule3::Vehicule3(const class Vehicule3 &)' already has a body
    'Vehicule3::Vehicule3' : error in function definition or declaration; function not called
    CVoiture::CVoiture' : no overloaded function takes 2 parameters
    'Ajouter' : function does not take 3 parameters
    S'est le principe que je comprends pas. je me demande d'où doivent venir les informations pour que le switch sache fonctionner.

    Voici le code du cpp mise à jour :

    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
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    #include <BasicConsole.h>
    #include "vehicule3.h"
    #include "chaine.h"
     
    FctnTraiterLigne(const CChargeurFichierTexte& CC, void* Contexte);
     
     
    Vehicule3::Vehicule3()
    :NombreDePlace(0)
    {
    }
     
    Vehicule3::~Vehicule3()
    {
    }
     
    Vehicule3::Vehicule3(const Vehicule3& Source) //constructeur par copie de CVehicule3
    :m_Immatriculation(Source.m_Immatriculation),m_NombreDePlaces(Source.m_NombreDePlaces)
    {
    }
     
    CVoiture::CVoiture()
    :m_VTM(0.0)
    {
    }
     
    CVoiture::CVoiture(const CVoiture& Source)
    :Vehicule3(Source)
    {
    }
     
     
    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_Immatriculation.EstVide();
    }
    et son .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
    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
    #include "chaine.h"
     
     
    class Vehicule3
    {
    public:
     
    	Vehicule3();
    	~Vehicule3();
     
     
     
    	short		NombreDePlace;
    	bool		Nom(const char* UnNom); //modificateur du nom
    	bool		EstValide() const;
     
     
    private:
    	CChaine		m_Immatriculation;
    	short		m_NombreDePlaces;
     
     
    };
     
    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
    };
    Merci d'avance pour votre aide.

    beegees

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je ne t'ai pas dit de recopier le constructeur de copie de Vehicule3, mais de lui créer un nouveau constructeur avec des paramètres différents...
    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.

  9. #9
    Membre éprouvé
    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 : 48
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Je ne t'ai pas dit de recopier le constructeur de copie de Vehicule3, mais de lui créer un nouveau constructeur avec des paramètres différents...
    Merci pour ta réponse Médinoc.

    Voici les constructeurs de Vehicule3 que j'ai (dis moi si j'ai tort) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Constructeur par défaut :
    
    Vehicule3::Vehicule3()
    :NombreDePlace(0)
    {
    }
    Constructeur par copie :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Vehicule3::Vehicule3(const Vehicule3& Source) //constructeur par copie de CVehicule3
    :m_Immatriculation(Source.m_Immatriculation),m_NombreDePlaces(Source.m_NombreDePlaces)
    {
    }
    Destructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Vehicule3::~Vehicule3()
    {
    }
    J'ai fais une recherche dans le document, il ne me semble pas qu'il y'ait un autre constructeur de Vehicule3.

    Je peux me tromper bien sûr.

    Merci pour ton aide.

    beegees

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ce que tu sembles ne pas avoir compris, c'est que des constructeurs, tu peux en ajouter autant que tu veux, prenant des paramètres variés.
    Y compris un qui prend l'immatriculation et le nombre de places en paramètres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Vehicule3::Vehicule3(const CChaine& immatriculation, short nombreDePlaces)
    :m_Immatriculation(immatriculation), m_NombreDePlaces(nombreDePlaces)
    {
    }
    (penser à l'ajouter à la classe également)
    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.

  11. #11
    Membre éprouvé
    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 : 48
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Ce que tu sembles ne pas avoir compris, c'est que des constructeurs, tu peux en ajouter autant que tu veux, prenant des paramètres variés.
    Y compris un qui prend l'immatriculation et le nombre de places en paramètres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Vehicule3::Vehicule3(const CChaine& immatriculation, short nombreDePlaces)
    :m_Immatriculation(immatriculation), m_NombreDePlaces(nombreDePlaces)
    {
    }
    (penser à l'ajouter à la classe également)
    Merci beaucoup médinoc,

    En effet, je ne pensais pas que l'on pouvais ajouter des constructeurs, où même si j'en avais déjà entendu parler, je n'avais pas encore le réflexe de le faire.

    J'ai ajouter le constructeur que tu m'as proposé dans la clase et dans le .cpp, j'obtiens malheureusement deux erreurs.

    error C2511: 'Vehicule3::Vehicule3' : overloaded member function 'void (const class CChaine &,short)' not found in 'Vehicule3'
    et le plus bizare des deux car j'ai vérifié mais il ne manque aucune accolade :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fatal error C1004: unexpected end of file found
    Je continue à chercher.

    Voici le code mis à jour : (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
    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
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    #include <BasicConsole.h>
    #include "vehicule3.h"
    #include "chaine.h"
     
     
    Vehicule3::Vehicule3()
    :NombreDePlace(0)
    {
    }
     
    Vehicule3::~Vehicule3()
    {
    }
     
    Vehicule3::Vehicule3(const CChaine& UneImmatriculation, short nombreDePlaces)
    :m_Immatriculation(UneImmatriculation), m_NombreDePlaces(UnShort)
    {
    }
     
    Vehicule3::Vehicule3(const Vehicule3& Source) //constructeur par copie de CVehicule3
    :m_Immatriculation(Source.m_Immatriculation),m_NombreDePlaces(Source.m_NombreDePlaces)
    {
    }
     
    CVoiture::CVoiture()
    :m_VTM(0.0)
    {
    }
     
    CVoiture::CVoiture(const CVoiture& Source)
    :Vehicule3(Source)
    {
    }
     
     
    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_Immatriculation.EstVide();
    }
    et la partie du point h qui a été modifiée :

    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
    class Vehicule3
    {
    public:
     
    	Vehicule3();
    	~Vehicule3();
    	Vehicule3(const Vehicule3& Source);
    	Vehicule3(const char* UneImmatriculation, short UnShort);
     
     
     
    	short		NombreDePlace;
    	bool		Immatriculation(const char* UneImmatriculation); //modificateur du nom
    	bool		EstValide() const;
     
     
    private:
    	CChaine		m_Immatriculation;
    	short		m_NombreDePlaces;
     
     
    };
    Merci encore pour tout.

    beegees

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    S'il y en a un qui prend une CChaine et l'autre un const char*, ça va pas trop le faire...
    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.

  13. #13
    Membre éprouvé
    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 : 48
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    S'il y en a un qui prend une CChaine et l'autre un const char*, ça va pas trop le faire...
    oh excuse moi médinoc

    Et bien, après ajout de ce constructeur dans le cpp et dans la classe, on revient aux deux mêmes erreurs que tantôt :

    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));
    error C2661: 'CVoiture::CVoiture' : no overloaded function takes 2 parameters
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C2660: 'Ajouter' : function does not take 3 parameters
    j'en peux plus

    Merci pour ton aide et surtout pour ta patience d'ange.

    beegees

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Eh bien maintenant, tu peux ajouter un constructeur à CVoiture comme tu l'as fait pour Vehicule3...
    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.

  15. #15
    Membre éprouvé
    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 : 48
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Eh bien maintenant, tu peux ajouter un constructeur à CVoiture comme tu l'as fait pour Vehicule3...
    Je présûme que si je mets ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CVoiture::CVoiture(const char* UneImmatriculation, short nombreDePlaces)
    :Vehicule3::m_Immatriculation(UneImmatriculation), Vehicule3::m_NombreDePlaces(NombreDePlace)
    {
    }
    S'est normal que j'ai des erreurs ?

    Je ne comprends pas pourquoi on doit insérer un constructeur de voiture.

    Merci d'avance pour ta réponse.

    beegees

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je ne comprends pas pourquoi on doit insérer un constructeur de voiture.
    Parce que c'est une CVoiture qui est construite dans la fonction TraiterLigne(), pas un Vehicule3.

    S'est normal que j'ai des erreurs ?
    Oui. On ne peut pas initialiser directement les membres de la classe de base dans la liste d'initialisation d'une classe dérivée. C'est pour ça que je t'ai fait ajouter un constructeur dans Vehicule3. Sauras-tu t'en servir?
    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.

  17. #17
    Membre éprouvé
    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 : 48
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Parce que c'est une CVoiture qui est construite dans la fonction TraiterLigne(), pas un Vehicule3.


    Oui. On ne peut pas initialiser directement les membres de la classe de base dans la liste d'initialisation d'une classe dérivée. C'est pour ça que je t'ai fait ajouter un constructeur dans Vehicule3. Sauras-tu t'en servir?
    Merci pour ta réponse.

    Sauras-tu t'en servir?
    je vais essayer sur base de l'exercice précédent fait par le prof.

    Je reviens pour te dire quoi.

    Merci pour tes explications hyper utiles.

    beegees

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