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

Vue hybride

stracoma deux classes et liste... 07/04/2015, 00h29
jo_link_noir Parce que la syntaxe n'est... 07/04/2015, 00h42
darkman19320 Salut, Comme le dit... 07/04/2015, 10h37
JolyLoic Pour quoi faire ? Ici, sauf... 09/04/2015, 18h57
darkman19320 Vu que le constructeur de la... 09/04/2015, 20h17
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de stracoma
    Homme Profil pro
    Médecin
    Inscrit en
    Août 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Maroc

    Informations professionnelles :
    Activité : Médecin

    Informations forums :
    Inscription : Août 2013
    Messages : 413
    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

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    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 : 760
    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
    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 : 50
    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
    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
    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 : 50
    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
    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.

+ 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