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 :

deux classes et liste initialisation


Sujet :

C++

  1. #1
    Membre actif Avatar de stracoma
    Homme Profil pro
    Médecin
    Inscrit en
    Août 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Maroc

    Informations professionnelles :
    Activité : Médecin

    Informations forums :
    Inscription : Août 2013
    Messages : 413
    Points : 229
    Points
    229
    Par défaut deux classes et liste initialisation
    Bonsoir à vous. J'ai besoin de votre aide. Regardons le code suivant:
    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
    #include <iostream>
    #include <string>
    using namespace std;
    class Etudiant
    {
    private:
        string nom;
        string prenom;
        int age;
    public:
        Etudiant(string n, string p, int a):
            nom(n),prenom(p),age(a){}
        void affiche()
        { cout<<nom<<" === "<<prenom<<" === "<<age<<endl;}
    };
    class Ecole
    {
    private:
        int nbr_de_classes;
        Etudiant membre;
    public:
       Ecole(int ndc,string n,string p,int a):
            nbr_de_classes(ndc),membre(n,p,a){}
     
        void affiche()
        {
            cout<<nbr_de_classes<<endl;
            membre.affiche();
        }
     
    };
    int main()
    {
       cout<<"Tout ce passe bien"<<endl;
        return 0;
    }
    Pourquoi ce nouveau constructeur d'initialisation de la classe Ecole ne marche pas?:
    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
    #include <iostream>
    #include <string>
    using namespace std;
    class Etudiant
    {
    private:
        string nom;
        string prenom;
        int age;
    public:
        Etudiant(string n, string p, int a):
            nom(n),prenom(p),age(a){}
        void affiche()
        { cout<<nom<<" === "<<prenom<<" === "<<age<<endl;}
    };
    class Ecole
    {
    private:
        int nbr_de_classes;
        Etudiant membre;
    public:
        Ecole(int ndc,Etudiant e):
        nbr_de_classes(ndc),membre.nom(e.nom),membre.prenom(e.prenom),membre.age(e.age){}
     
     
        void affiche()
        {
            cout<<nbr_de_classes<<endl;
            membre.affiche();
        }
     
    };
    int main()
    {
       cout<<"Tout ce passe bien"<<endl;
        return 0;
    }
    Merci à vous
    J'apprends la programmation pour le plaisir

  2. #2
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Parce que la syntaxe n'est pas valide.
    Le but de la liste d'initialisation est d'initialiser les membres, pas les membres des membres.
    Et puis bon, avec cette forme, où se trouve l'appel du constructeur de Etudiant ?

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Salut,

    Comme le dit jo_link_noir, la syntaxe est incorrecte: tu ne peux pas faire appel aux fonctions d'un objet au niveau de l'instantiation de celui-ci (il n'existe pas encore).
    Petit conseil, fait un constructeur par copie: regarde la FAQ

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par darkman19320 Voir le message
    Petit conseil, fait un constructeur par copie: regarde la FAQ
    Pour quoi faire ? Ici, sauf si je n'ai vraiment pas les yeux en face des trous, ça ne servirait à rien. Et comme ce n'est pas si évident à écrire, autant ne rien faire, ça n'en marchera que mieux
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Pour quoi faire ? Ici, sauf si je n'ai vraiment pas les yeux en face des trous, ça ne servirait à rien. Et comme ce n'est pas si évident à écrire, autant ne rien faire, ça n'en marchera que mieux
    Vu que le constructeur de la classe Ecole est de cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ecole(int ndc,Etudiant e);
    Et que cette classe contient un étudiant, je voyais plus simple de faire un constructeur de copie pour la classe Etudiant au lieu de faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Ecole(int ndc, const Etudiant & e): nbr_de_classes(ndc),membre(e.nom(), e.prenom(), e.age()) //En supposant que les accesseurs soient implémentés...
    {}
    D'après la question, il s'agit d'un débutant donc autant lui apprendre à faire des constructeurs par copie, non? (bien que dans ce cas précis, le constructeur par copie généré automatiquement par le compilateur devrait faire l'affaire)

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par darkman19320 Voir le message
    Vu que le constructeur de la classe Ecole est de cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ecole(int ndc,Etudiant e);
    Et que cette classe contient un étudiant, je voyais plus simple de faire un constructeur de copie pour la classe Etudiant au lieu de faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Ecole(int ndc, const Etudiant & e): nbr_de_classes(ndc),membre(e.nom(), e.prenom(), e.age()) //En supposant que les accesseurs soient implémentés...
    {}
    Je suis d'accord sur le fait qu'il est plus simple et plus souple de copier un étudiant plutôt que d'en reconstruire un pièce à pièce. Là où je ne suis pas d'accord, c'est d'écrire un constructeur de copie pour faire ça.

    Citation Envoyé par darkman19320 Voir le message
    D'après la question, il s'agit d'un débutant donc autant lui apprendre à faire des constructeurs par copie, non? (bien que dans ce cas précis, le constructeur par copie généré automatiquement par le compilateur devrait faire l'affaire)
    Je pense que s'il est important d'apprendre assez tôt la notion de copie, il est déjà primordial d'apprendre dans quels cas on n'a pas besoin de faire quoi que ce soit pour que la copie marche.

    Apprendre comment écrire un constructeur de copie pas par défaut me semble bien moins urgent. Je ne dis pas qu'il ne faut pas savoir le faire, seulement, je considère ça comme un sujet déjà avancé (et le nombre de classes où j'ai vu des constructeurs de copie mal implémentés me conforte dans mon opinion). C'est plein de subtilités sur la manière de l'implémenter correctement et sans pertes de performances, ça demande d'assimiler non pas 1 mais 5 fonctions spéciales d'un coup, c'est un risque de plus lors des modifications du code.

    Et ce qui me gêne le plus, c'est que d'en montrer trop tôt, alors que ce n'est pas nécessaire, sous-entend que c'est une pratique normale d'en mettre (j'ai vu des gens qui pensaient qu'il fallait en mettre pour toutes les classes), alors que c'est l'exception (je n'arrive honnêtement pas à me rappeler la dernière fois que j'en ai mis un dans du vrai code).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Membre actif Avatar de stracoma
    Homme Profil pro
    Médecin
    Inscrit en
    Août 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Maroc

    Informations professionnelles :
    Activité : Médecin

    Informations forums :
    Inscription : Août 2013
    Messages : 413
    Points : 229
    Points
    229
    Par défaut
    Bonsoir.
    jo_link_noir:
    Parce que la syntaxe n'est pas valide.
    Le but de la liste d'initialisation est d'initialiser les membres, pas les membres des membres.
    après ça je me suis dit je laisse tomber.
    Mais j'ai suivi le conseil de: darkman19320
    Petit conseil, fait un constructeur par copie: regarde la FAQ
    J'y suis allé, mais mon problème (depuis mon enfance), je n'ai jamais compris un cours non illustré par un exemple, ou plutôt un exercice basique mais corrigé.
    après ce message:
    Vu que le constructeur de la classe Ecole est de cette forme :

    Code :Sélectionner tout - Visualiser dans une fenêtre à part
    Ecole(int ndc,Etudiant e);
    Et que cette classe contient un étudiant, je voyais plus simple de faire un constructeur de copie pour la classe Etudiant au lieu de faire:

    Code :Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Ecole(int ndc, const Etudiant & e): nbr_de_classes(ndc),membre(e.nom(), e.prenom(), e.age()) //En supposant que les accesseurs soient implémentés...
    {}
    D'après la question, il s'agit d'un débutant donc autant lui apprendre à faire des constructeurs par copie
    Effectivement, je suis un "pré-débutant", j'ai vainement essayé d'utiliser ce constructeur de copie mais sans succès (car je ne l'ai jamais fait auparavant);
    si quelqu'un me le fasse pour que je puisse l'assimiler.
    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public:
        Ecole(int ndc, const Etudiant & e): nbr_de_classes(ndc),membre(e.nom(), e.prenom(), e.age()) {}
    mais le débogueur me signale que nom est privé.
    J'apprends la programmation pour le plaisir

  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 stracoma Voir le message
    Effectivement, je suis un "pré-débutant", j'ai vainement essayé d'utiliser ce constructeur de copie mais sans succès (car je ne l'ai jamais fait auparavant);
    si quelqu'un me le fasse pour que je puisse l'assimiler.
    Si, tu l'as déjà utilisé, et bien plus souvent que tu ne le penses.
    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
    class Etudiant
    {
    private:
        string nom;
        string prenom;
        int age;
    public:
        // tu prends des string en parametres et non des refs constantes : ça implique une copie
        // et donc un appel au constructeur par copie
        Etudiant(string n, string p, int a):
            nom(n), // utilisation du ctor par copie de std::string (2eme copie donc)
            prenom(p), // pareil
            age(a)
        {}
        void affiche()
        { cout<<nom<<" === "<<prenom<<" === "<<age<<endl;}
    };
    (C'est probablement un constructeur par mouvement qui sera appelé, mais ça ne change pas grand chose ici).

    Pour les std::string, tu les copies sans t'occuper de ce qu'ils contiennent réellement. C'est exactement la même chose pour Etudiant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Ecole
    {
    private:
        int nbr_de_classes;
        Etudiant membre;
    public:
        Ecole(int ndc,Etudiant e):
           nbr_de_classes(ndc),
           membre(e) // appel du ctor par copie de Etudiant, celui par défaut suffit ici
        {}
    };

  9. #9
    Membre actif Avatar de stracoma
    Homme Profil pro
    Médecin
    Inscrit en
    Août 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Maroc

    Informations professionnelles :
    Activité : Médecin

    Informations forums :
    Inscription : Août 2013
    Messages : 413
    Points : 229
    Points
    229
    Par défaut
    Iradrrille, Merciiiiiiiii
    C'est ce que je cherchais depuis le début. Maintenant ça marche et surtout j'ai compris la logique.
    C'est dommage q'on ne peut pas voter un message plus d'une fois
    J'apprends la programmation pour le plaisir

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

Discussions similaires

  1. Permuttez les éléments de deux zones de liste
    Par flo64 dans le forum Access
    Réponses: 4
    Dernier message: 01/06/2006, 09h15
  2. Faire passer des items entre deux zones de listes
    Par ludobado dans le forum Access
    Réponses: 8
    Dernier message: 04/05/2006, 18h33
  3. Mettre en relation deux zones de liste déroulante
    Par mfavier dans le forum Access
    Réponses: 2
    Dernier message: 25/04/2006, 11h49
  4. Aide sur POO :: Classe et liste d'objet
    Par Andry dans le forum Langage
    Réponses: 1
    Dernier message: 23/01/2006, 15h51
  5. Réponses: 5
    Dernier message: 17/08/2005, 12h40

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