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 :

Aucun des constructeur n'envoie les bonnes informations à ma méthode


Sujet :

C++

  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 Aucun des constructeur n'envoie les bonnes informations à ma méthode
    Bonjour tout le monde,

    Je dois charger le contenu d'un fichier txt mais j'ai déjà un problème

    Mon problème se situe dans cette méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    bool CTabFauxFreres::TraiterLigne(const CChargeurFichierTexte& Chargeur)
    {
    	if (Chargeur.NombreChamps() == 7) Ajouter(CFauxFrere(Chargeur.Champs(0),Chargeur.Champs(1),Chargeur.Champs(2),Chargeur.Champs(3),Chargeur.Champs(4),Chargeur.Champs(5),Chargeur.Champs(6)));
    	return true;
    }
    et le message d'erreur est le suivant :

    error C2665: 'CFauxFrere::CFauxFrere' : none of the 3 overloads can convert parameter 1 from type 'const char *'
    La méthode TraiterLigne est appelée par cette méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    bool CTabFauxFreres::Charger(const char* NomFichier)
    {
    	CChargeurFichierTexte	Chargeur;
     
    	return Chargeur.Charger(NomFichier,'\t',FctnTraiterLigne,this);
    }
    et je pense qu'elle reçoit les informations du constructeur par copie (je n'en suis pas sûr) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CFauxFrere::CFauxFrere(const CFauxFrere& Source)
    :m_Code(Source.m_Code),m_Nom(Source.m_Nom),m_Nature(Source.m_Nature),m_Feminin(Source.m_Feminin),m_Pluriel(Source.m_Pluriel),m_Descriptif(Source.m_Descriptif),m_Definition(Source.m_Definition)
    {
    }
    Voici la déclaration de la fonction TraiterLigne dans le header file :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	bool		TraiterLigne(const CChargeurFichierTexte& Chargeur);
    Edit : Je viens avec du nouveau :

    Si le paramètre 1 est bien m_Code de type short, j'ai alors mis :

    Ajouter(CFauxFrere((short)atol(Chargeur.Champs(0))

    le message d'erreur est donc maintenant :

    error C2665: 'CFauxFrere::CFauxFrere' : none of the 3 overloads can convert parameter 3 from type 'const char *'
    Je pense que le paramètre est de type booléen, comment puis-je faire la même chose pour un booléen ?

    Quand il parle de paramètre 1, s'est bien le champ 0 ?

    Voilà, je vous remercie d'avance pour votre aide.

    beegees

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

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ajouter(CFauxFrere((short)atol(Chargeur.Champs(0))
    Ne vaut-t-il pas mieux utiliser atoi pour un short?

    Pour ton erreur, il faudrait voir le troisième paramètre que tu passe à ton constructeur CFauxFrere, tu ne nous montres que le premier (qui est valide ).

    Le message d'erreur signifie que normalement, dans le cas où tu te trouves, le troisième paramètre ne doit pas être de type const char*.

    Peux - tu nous montrer toute la ligne, et les trois constructeurs de CFauxFrere?

    Coyotte507

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Hello,

    Je pense que tu devrais regarder de ce côté :

    http://cpp.developpez.com/faq/cpp/?p...NGS_convert_to

    Je suppose bien entendu que tu as un constructeur CFauxFrere prenant 7 paramètres ? (Pas trop compris pourquoi tu mentionnes les constructeurs par copie, le pb vient juste du fait qu'il ne trouve pas de constructeur adapté pour CFauxFrere à partir de 7 const char*).

    Dans le cas où le lien précédent ne répond pas à ta question, peux-tu poster la déclaration de tes constructeurs de CFauxFrere ?

  4. #4
    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 beegees,
    Salut Coyotte, merci pour ta réponse.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ajouter(CFauxFrere((short)atol(Chargeur.Champs(0))
    Ne vaut-t-il pas mieux utiliser atoi pour un short?
    OK j'ai changé, merci pour l'astuce.


    Pour ton erreur, il faudrait voir le troisième paramètre que tu passe à ton constructeur CFauxFrere, tu ne nous montres que le premier (qui est valide ).
    Voici tous les paramètres envoyés au constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	short			m_Code;       
    	CChaine			m_Nom;       
    	CChaine			m_Nature;    
    	bool			m_Feminin;    
    	bool			m_Pluriel;    
    	CChaine			m_Descriptif;
    	CChaine			m_Definition;
    Je ne comprends pas bien comment mon compilo compte les paramètres.

    Le message d'erreur signifie que normalement, dans le cas où tu te trouves, le troisième paramètre ne doit pas être de type const char*.
    Nous sommes d'accord sur ce point. si les paramètres commencent à zéro, alors on parle du bool m_Feminin.

    J'avais le problème avec le premier élément et je l'ai changé en short.

    Peux - tu nous montrer toute la ligne, et les trois constructeurs de CFauxFrere?
    bien sûr :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CFauxFrere::CFauxFrere()
    {
    }
     
    CFauxFrere::CFauxFrere(const CFauxFrere& Source)
    :m_Code(Source.m_Code),m_Nom(Source.m_Nom),m_Nature(Source.m_Nature),m_Feminin(Source.m_Feminin),m_Pluriel(Source.m_Pluriel),m_Descriptif(Source.m_Descriptif),m_Definition(Source.m_Definition)
    {
    }
     
    CFauxFrere::CFauxFrere(short CodeIdentification,const char* Nom, char Attribut,bool Feminin,bool Pluriel,const char* type,const char* Definition)
    {
    }
    et voici le code de la fonction TratierLigne qui travaille avec le troisième constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    bool CTabFauxFreres::TraiterLigne(const CChargeurFichierTexte& Chargeur)
    {
    	if (Chargeur.NombreChamps() == 7) Ajouter(CFauxFrere((short)atoi(Chargeur.Champs(0)),Chargeur.Champs(1),Chargeur.Champs(2),bool(Chargeur.Champs(3)),Chargeur.Champs(4),Chargeur.Champs(5),Chargeur.Champs(6)));
    	return true;
    }

    Je te laisse mon fichier.cpp au cas où :

    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
    #include <BasicConsole.h>
    #include "FFDD1.h"
     
    ////////////////////
    //class CFauxFrere//
    ////////////////////
     
    CFauxFrere::CFauxFrere()
    {
    }
     
    CFauxFrere::CFauxFrere(const CFauxFrere& Source)
    :m_Code(Source.m_Code),m_Nom(Source.m_Nom),m_Nature(Source.m_Nature),m_Feminin(Source.m_Feminin),m_Pluriel(Source.m_Pluriel),m_Descriptif(Source.m_Descriptif),m_Definition(Source.m_Definition)
    {
    }
     
    CFauxFrere::CFauxFrere(short CodeIdentification,const char* Nom, char Attribut,bool Feminin,bool Pluriel,const char* type,const char* Definition)
    {
    }
     
    CFauxFrere::~CFauxFrere()
    {
    }
     
    CGenerique*	CFauxFrere::Cloner() const
    {
    	return new CFauxFrere(*this);
    }
     
    bool	CFauxFrere::EstValide() const 
    {
    	return true;
    }
     
    long	CFauxFrere::NombreClesDeTri() const
    {
    	return 1;
    }
     
     
    ////////////////////////
    //class TabCFauxFrere///
    ////////////////////////
     
    CTabFauxFreres::CTabFauxFreres()
    :CTableauGenerique(CFauxFrere())
    {
    }
     
    CTabFauxFreres::CTabFauxFreres(const CTabFauxFreres& Source)
    :CTableauGenerique(Source)
    {
    }
     
    CTabFauxFreres::~CTabFauxFreres()
    {
    }
     
    CGenerique* CTabFauxFreres::Cloner() const
    {
    	return new CTabFauxFreres(*this);
    }
     
    bool CTabFauxFreres::Ajouter(const CFauxFrere& Modele)
    {
    	return CTableauGenerique::Ajouter(Modele);
    }
     
    bool CTabFauxFreres::Charger(const char* NomFichier)
    {
    	CChargeurFichierTexte	Chargeur;
     
    	return Chargeur.Charger(NomFichier,'\t',FctnTraiterLigne,this);
    }
     
    bool CTabFauxFreres::FctnTraiterLigne(const CChargeurFichierTexte& Chargeur, void* Contexte)
    {
    	return ((CTabFauxFreres*)Contexte)->TraiterLigne(Chargeur);
    }
     
    //ceci travaille avec le constructeur par copie de CFauxFrere
    bool CTabFauxFreres::TraiterLigne(const CChargeurFichierTexte& Chargeur)
    {
    	if (Chargeur.NombreChamps() == 7) Ajouter(CFauxFrere((short)atoi(Chargeur.Champs(0)),Chargeur.Champs(1),Chargeur.Champs(2),bool(Chargeur.Champs(3)),Chargeur.Champs(4),Chargeur.Champs(5),Chargeur.Champs(6)));
    	return true;
    }
    Merci pour tout et bon début de Week-End.

    beegees

  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 bolhrak Voir le message
    Hello,

    Je pense que tu devrais regarder de ce côté :

    http://cpp.developpez.com/faq/cpp/?p...NGS_convert_to

    Je suppose bien entendu que tu as un constructeur CFauxFrere prenant 7 paramètres ? (Pas trop compris pourquoi tu mentionnes les constructeurs par copie, le pb vient juste du fait qu'il ne trouve pas de constructeur adapté pour CFauxFrere à partir de 7 const char*).

    Dans le cas où le lien précédent ne répond pas à ta question, peux-tu poster la déclaration de tes constructeurs de CFauxFrere ?
    Hello bolhrak,

    Merci pour ta réponse.

    Malheureusement ton lien ne m'aide pas beaucoup car notre Prof utilise une console et n'utilise pas std:: ... je sais, s'est pas, bien !!!

    J'ai laissé plus d'info dans le message précédent.

    Merci encore et bon début de WE.

    beegees

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

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CFauxFrere::CFauxFrere(short CodeIdentification,const char* Nom, char Attribut,bool Feminin,bool Pluriel,const char* type,const char* Definition)
    {
    }
    Comme tu le vois, dans ce constructeur, ton troisième paramètre est de type char et non const char*.

    Es-tu sûr que tu veux un char à cet endroit?

    Si oui, alors lorsque tu appelles ta fonction, en troisième paramètre tu dois passer un char, et non un const char* (Tu passes Chargeur.Champs(2), qui est un const char*)

  7. #7
    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 coyotte507 Voir le message
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CFauxFrere::CFauxFrere(short CodeIdentification,const char* Nom, char Attribut,bool Feminin,bool Pluriel,const char* type,const char* Definition)
    {
    }
    Comme tu le vois, dans ce constructeur, ton troisième paramètre est de type char et non const char*.

    Es-tu sûr que tu veux un char à cet endroit?

    Si oui, alors lorsque tu appelles ta fonction, en troisième paramètre tu dois passer un char, et non un const char* (Tu passes Chargeur.Champs(2), qui est un const char*)
    Salut Coyotte,

    Comment va ?

    Un tout grand merci pour ton aide.

    S'est donc un constructeur spécifique qu'il utilise ?

    S'est donc ce constructeur ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CFauxFrere::CFauxFrere(short CodeIdentification,const char* Nom, const char* Attribut,bool Feminin,bool Pluriel,const char* type,const char* Definition)
    {
    }
    et non celui-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CFauxFrere::CFauxFrere(const CFauxFrere& Source)
    :m_Code(Source.m_Code),m_Nom(Source.m_Nom),m_Nature(Source.m_Nature),m_Feminin(Source.m_Feminin),m_Pluriel(Source.m_Pluriel),m_Descriptif(Source.m_Descriptif),m_Definition(Source.m_Definition)
    {
    }
    ça me semble mieux maintenant, merci

    J'ai une nouvelle erreur, je l'a met dans ce message au cas où ça te dirais quelque chose :

    LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
    Debug/FauxFreresDD1.exe : fatal error LNK1120: 1 unresolved externals
    Error executing link.exe.
    Encore un tout grand merci pour ton aide.

    beegees

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

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

    ça va bien en ce moment avec les jours fériés

    Je ne connais rien à visual C++, pour moi ton message veut dire qu'il ne trouve pas la fonction main, mais franchement j'en suis pas sûr.


    Pour répondre à ton autre question, le constructeur utilisé dépend des paramètres passés. Le constructeur par copie est appelé dans certains cas spéciaux (enfin souvent quand même, sans que l'on s'en rende compte), ou lorsqu'on lui passe en argument un objet du même type en référence constante.

    Dès lors qu'on lui passe un autre type d'argument, ou bien plusieurs arguments, c'est le constructeur qui correspond à ces arguments qui est appelé, jamais le constructeur par copie

  9. #9
    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 coyotte507 Voir le message
    Salut beegees,

    ça va bien en ce moment avec les jours fériés

    Je ne connais rien à visual C++, pour moi ton message veut dire qu'il ne trouve pas la fonction main, mais franchement j'en suis pas sûr.


    Pour répondre à ton autre question, le constructeur utilisé dépend des paramètres passés. Le constructeur par copie est appelé dans certains cas spéciaux (enfin souvent quand même, sans que l'on s'en rende compte), ou lorsqu'on lui passe en argument un objet du même type en référence constante.

    Dès lors qu'on lui passe un autre type d'argument, ou bien plusieurs arguments, c'est le constructeur qui correspond à ces arguments qui est appelé, jamais le constructeur par copie
    Salut Coyotte,

    Problème résolu

    J'avais juste oublié d'inclure la console magique du Prof

    Je suis content d'avoir compris s'était le constructeur spécifique et non celui par copie, j'aurai appris quelque chose d'important grâce à toi.

    Merci pour tout et bon samedi.

    beegees

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/07/2012, 15h22
  2. Détection des impressions lancées et les informations associées
    Par masterx_goldman dans le forum Windows
    Réponses: 1
    Dernier message: 06/09/2009, 10h55
  3. Réponses: 3
    Dernier message: 10/04/2009, 13h26
  4. Bonnes pratiques des constructeurs multiples
    Par TheDrev dans le forum C++
    Réponses: 6
    Dernier message: 05/05/2008, 19h06
  5. [MySQL] envoie les valeurs des cases à cocher
    Par soussan dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 19/06/2006, 17h18

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