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 de conversion lors d'une insertion d'un objet à partir d'une liste vers un vecteur


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Maintenance Prédictive
    Inscrit en
    Mars 2017
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Maintenance Prédictive
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2017
    Messages : 39
    Points : 25
    Points
    25
    Par défaut Problème de conversion lors d'une insertion d'un objet à partir d'une liste vers un vecteur
    Bonjour,

    Dans la fonction ci-dessous, j'obtiens l'erreur suivante à la compilation :
    "error C2664: 'std::_Vector_iterator<_Myvec> std::vector<_Ty>::insert(std::_Vector_const_iterator<_Myvec>,_Ty &&)' : impossible de convertir le paramètre 2 de 'Employe' en 'Cadre &&'"

    Je suis allé voir dans le FAQ et les tutos si je n'y trouvais pas rapidement une réponse mais sans succè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
    void Promotion(list<Employe> &tabEmployeL, vector<Cadre> &tabCadreV){
    	vector<Cadre>::iterator iterV;
    	list<Employe>::iterator itMax1E;
    	list<Employe>::iterator itMax2E;
     
    	itMax1E=max_element(tabEmployeL.begin(),tabEmployeL.end(),cmpAgeEmployes);
     
    	cout<<"LES 2 employés les plus Agés à promouvoir sont :"<<endl;
    	itMax1E->affiche();
    	tabCadreV.insert(tabCadreV.begin(),itMax1E);
    	tabEmployeL.erase(itMax1E);
    	itMax2E=max_element(tabEmployeL.begin(),tabEmployeL.end(),cmpAgeEmployes);
    	itMax2E->affiche();
    	tabCadreV.insert(tabCadreV.begin(),itMax2E);
    	tabEmployeL.erase(itMax2E);
    }
    voici les classes Employe et Cadre qui héritent toutes deux de la classe mère Salarie et les paramètres Age sont présents dans les 2.

    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
    class Salarie
    {
    public:
    	void saisie();
    	void affiche();
    protected:
    	string Nom;
    	int Salaire;
    };
     
    class Employe : public Salarie
    {
    public:
    	void saisie();
    	void affiche();
    	bool operator < (Employe b);
    	int getAge();
    private:
    	int Age;
    	friend class Actionnaire;
     
    };
     
    class Cadre : public Salarie
    {
    public:
    	void saisie();
    	void affiche();
    private:
    	int Age;
    	friend class Actionnaire;
     
    };

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 642
    Points
    7 642
    Par défaut
    Bonjour,

    Tu cherches à mettre un Employe dans une liste de Cadre. Ça n'a pas de sens, une instance ne peut pas être Employe et Cadre!
    Pour effectuer une promotion, il faut impérativement créer un nouvelle variable du type Cadre qui sera créée à partir de ce que l'on sait de l'ex-Employe.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    A quelle ligne est indiquée l'erreur, SVP ?

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Maintenance Prédictive
    Inscrit en
    Mars 2017
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Maintenance Prédictive
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2017
    Messages : 39
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par dalfab Voir le message
    Bonjour,

    Tu cherches à mettre un Employe dans une liste de Cadre. Ça n'a pas de sens, une instance ne peut pas être Employe et Cadre!
    Pour effectuer une promotion, il faut impérativement créer un nouvelle variable du type Cadre qui sera créée à partir de ce que l'on sait de l'ex-Employe.
    Merci.
    Donc un container d'instances doit évidemment aussi implicitement ne contenir que des instances de la meme classe (normal puisqu'on le declare comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    list<Employe> ListeEmployes_L
    vector<Cadre> ListeCadres_V
    On ne pourrait le faire qu'avec 2 container (list et vector) declares et remplis d'instances de memes classes.
    Evident mais trop pour que je ne l'ai vu. Ce qui m'a induit en erreur c'est l'héritage entre Salarie et Employe et Cadre. Donc bien que Employe et Cadre héritent de Salarie, ce sont effectivement des instances différentes.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Maintenance Prédictive
    Inscrit en
    Mars 2017
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Maintenance Prédictive
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2017
    Messages : 39
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par bacelar Voir le message
    A quelle ligne est indiquée l'erreur, SVP ?
    Bonjour 10 et 16, là où j'utilise l'insert dans le vector en essayant d'y faire entrer un Employe dans un vector de Cadre.
    Merci. Daflab a répondu à ma question.
    Je teste ce qu'il m'a conseillé et reviens vers tous.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Maintenance Prédictive
    Inscrit en
    Mars 2017
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Maintenance Prédictive
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2017
    Messages : 39
    Points : 25
    Points
    25
    Par défaut
    Voilà

    La fonction membre pour modifier les données du nouveau cadre sur base des données de l'ancien employé promu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void Promouvoir(Employe &E, Cadre &C){
    	string NomTemp;
    	NomTemp=E.getNom();
    	C.setNom(NomTemp);
    	int AgeTemp;
    	AgeTemp=E.getAge();
    	C.setAge(AgeTemp);
    	int SalaireTemp;
    	SalaireTemp=E.getSalaire();
    	C.setSalaire(SalaireTemp);
    }
    Et la fonction promotion:
    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
    void Promotion(list<Employe> &tabEmployeL, vector<Cadre> &tabCadreV){
    	vector<Cadre>::iterator iterV;
    	list<Employe>::iterator itMax1E;
    	list<Employe>::iterator itMax2E;
    	Employe EmployePromu1;
    	Employe EmployePromu2;
    	Cadre CadreTempoPromo1;
    	Cadre CadreTempoPromo2;
     
    	itMax1E=max_element(tabEmployeL.begin(),tabEmployeL.end(),cmpAgeEmployes);
    	EmployePromu1=*itMax1E;
    	cout<<"LES 2 employés les plus Agés à promouvoir sont :"<<endl;
    	itMax1E->affiche();
    	Promouvoir(EmployePromu1, CadreTempoPromo1);
    	tabCadreV.insert(tabCadreV.begin(),CadreTempoPromo1);
    	tabEmployeL.erase(itMax1E);
    	itMax2E=max_element(tabEmployeL.begin(),tabEmployeL.end(),cmpAgeEmployes);
    	EmployePromu2=*itMax2E;
    	Promouvoir(EmployePromu2, CadreTempoPromo2);
    	itMax2E->affiche();
    	tabCadreV.insert(tabCadreV.begin(),CadreTempoPromo2);
    	tabEmployeL.erase(itMax2E);
    	cout<<"LES 2 employés les plus Agés à promouvoir sont :"<<endl;
    	CadreTempoPromo1.affiche();
    	CadreTempoPromo2.affiche();
    	}
    Elle n'est sûrement pas optimale (trop de variables, une méthode très basique pour tirer les 2 employés les plus âgés) et ne permet pas d'introduire dans l'ordre alphanumérique les nouveaux cadres dans le vecteur (dû à la méthode douteuse pour retrouver les 2 plus âgés).

    Si quelques a quelques conseils pour une meilleure méthode afin d'optimiser le code cette fonction (en restant avec des choses basiques de mon niveau bien sûr), ils sont les bienvenus.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    Heu, pourquoi ne pas avoir un constructeur de "Cadre" 'explicite' qui prend en paramètre une référence temporaire de "Employe".
    Vous n'aurez pas à construire des Cadre au préalable, vous pouvez "vampiriser" l'"Employe" passé en paramètre et le 'explicite' évitera de faire cette promotion sans le vouloir vraiment.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Cadre : public Salarie
    {
    public:
    	void saisie();
    	void affiche();
    ...
            explicit Cadre(Employe&& employe):Age(employe.Age),Nom(employe.Nom){};
    ....
    private:
    	int Age;
    	friend class Actionnaire;
     
    };
    EDIT :
    explicite

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Maintenance Prédictive
    Inscrit en
    Mars 2017
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Maintenance Prédictive
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2017
    Messages : 39
    Points : 25
    Points
    25
    Par défaut
    Merci,

    Constructeur par paramètres je connais mais je ne maîtrise pas bien, explicite je ne connais pas du tout.
    Par contre juste avec un constructeur par paramètres, y a t'il moyen de se débrouiller sans le explicit ?

    La notion de constructeur de copie est-elle utile ici ?

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    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 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Pourquoi surtout ne pas faire du vrai polymorphisme ? Au lieu de ce vieux héritage et masquage.
    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.

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Maintenance Prédictive
    Inscrit en
    Mars 2017
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Maintenance Prédictive
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2017
    Messages : 39
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Pourquoi surtout ne pas faire du vrai polymorphisme ? Au lieu de ce vieux héritage et masquage.
    Bonjour,
    Merci.

    Tout simplement parce que :
    - le prof ne l'a pas vu au cours mais juste esquissé durant 30sec un slide qu'on a juste pu prendre en photo,
    - avant d'utiliser des techniques, certes performantes, il faut toujours savoir faire les choses basiquement.

    Mais oui je testerai, mais après l'examen ...

  11. #11
    Membre averti Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Points : 341
    Points
    341
    Par défaut
    Citation Envoyé par CaRoule Voir le message
    Constructeur par paramètres je connais mais je ne maîtrise pas bien, explicite je ne connais pas du tout.
    Par contre juste avec un constructeur par paramètres, y a t'il moyen de se débrouiller sans le explicit ?
    En court, le mot clé explicit utilisé en préfixe du constructeur va interdire le compilateur de réaliser des conversions implicites qui pourraient être malvenues et non-souhaitées, et qui peuvent cacher des bugs (toujours se méfier de l'implicite ).

    Avec un exemple:
    Tu as défini une classe MyString qui a un constructeur avec un seul argument MyString(int size), et tu définis aussi la fonction qui permette de l'afficher en console: print(const MyString&).
    Admettons qu'en un point de ton programme, tu veuilles appeler print("3") et que tu t'attendes à ce que ça affiche "3" en console. Tu te plantes un peu dans la syntaxe parce que tu es pressé, et tu écris print(3). Le compilateur ne va rien te dire et le programme va afficher une chaîne de caractère vide, de longueur 3. Si tu es comme moi, tu vas passer une plombe à identifier le problème
    Normalement, quand tu te plantes en écrivant du code qui ne correspond pas à ton intention, tu aimes que ton ami le compilateur te le signale. Préfixer le constructeur avec explicit permet au compilateur de t'aider en interdisant la conversion implicite. Par défaut, tu préféreras marquer comme explicit tous les constructeurs avec un seul argument. Quand une conversion implicite sera voulue par choix de conception, il te suffira de le supprimer.

    avant d'utiliser des techniques, certes performantes, il faut toujours savoir faire les choses basiquement.
    Je pense que par "basiquement", tu sous-entends "inutilement compliqué et risqué, mais nécessitant peu de connaissances", alors que tes interlocuteurs sur ce forum préfèreront la définition de "meilleur compromis entre complexité conceptuelle, clarté du code, performances et connaissances requises". Perso je leur aie fait confiance et ça paye
    Le débutant, lui, ignore qu'il ignore à ce point, il est fier de ses premiers succès, bien plus qu'il n'est conscient de l'étendue de ce qu'il ne sait pas, dès qu'il progresse en revanche, dès que s'accroît ce qu'il sait, il commence à saisir tout ce qui manque encore à son savoir. Qui sait peu ignore aussi très peu. [Roger Pol-Droit]
    Github
    Mon tout premier projet: une bibliothèque de simulation de génétique des populations

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    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
    class Salarie
    {
    public:
    	void saisie();
    	void affiche(){std::cout << "Nom: " << Nom << std::endl;}
    	Salarie(std::string nom):Nom(nom){}
    protected:
    	std::string Nom;
    	int Salaire;
    };
     
    class Employe : public Salarie
    {
    public:
    	void saisie();
    	void affiche(){std::cout << "Nom: " << Nom << "|Age " << Age << std::endl;}
    	bool operator < (Employe b);
    	int getAge() const {return Age;}
    	std::string getNom() const {return Nom;}
     
    	Employe(int age, std::string nom):Age(age),Salarie(nom){}
    private:
    	int Age;
    	friend class Actionnaire;
     
    };
     
    bool sortEmployeByAge (const Employe& rh, const Employe& lh) { return (rh.getAge() < lh.getAge()); }
     
    class Cadre : public Salarie
    {
    public:
    	void saisie();
    	void affiche();
    	explicit Cadre(Employe&& employe):Age(employe.getAge()),Salarie(employe.getNom()){};
    private:
    	int Age;
    	friend class Actionnaire;
     
    };
     
     
     
    void Promotion(std::list<Employe> &tabEmployeL, std::vector<Cadre> &tabCadreV){
    	tabEmployeL.sort(sortEmployeByAge);
    	for(int i = std::min(2,(int)tabEmployeL.size()); i > 0 ; i--)
    	{
    		auto emp = tabEmployeL.back();
    		emp.affiche();
    		tabCadreV.push_back(Cadre(std::move(emp)));
    		tabEmployeL.pop_back();
    	}
    }
     
    int main()
    {
    	/*int toto;
    	std::cout<< sizeof(toto);*/
     
    	std::list<Employe> toto;
     
    	toto.push_back(Employe(50,"dede"));
    	toto.push_back(Employe(60,"dudu"));
    	toto.push_back(Employe(55,"didi"));
    	std::vector<Cadre> titi;
     
    	Promotion(toto,titi);
     
    	return 0;
    }

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    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 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par CaRoule Voir le message
    - avant d'utiliser des techniques, certes performantes, il faut toujours savoir faire les choses basiquement.
    Alors n'utilise pas d'héritage.
    Ton héritage est de toutes façons mal foutus et inutil, la seule raison d'être c'est d'avoir une variable nom dans la classe de base ?
    Fais juste 3 classes qui n'ont aucune relation, et chacun a ses propres membres et méthodes dupliquées comme l'est déjà Age.
    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.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/07/2015, 11h17
  2. Réponses: 3
    Dernier message: 28/11/2011, 14h34
  3. Réponses: 2
    Dernier message: 02/09/2010, 09h59
  4. [Unitils] [TestNG][DBUnit][JPA][Hibernate] problème de sequence lors d'un insert.
    Par Faiche dans le forum Tests et Performance
    Réponses: 1
    Dernier message: 19/10/2009, 16h39
  5. [Système] Problème de doublon lors d'un insert (voir fin)
    Par gregory.bts dans le forum Langage
    Réponses: 7
    Dernier message: 04/08/2007, 03h05

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