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 :

Liste d'initialisation dans les constructeurs


Sujet :

C++

  1. #1
    Membre à l'essai
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    32
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 32
    Points : 21
    Points
    21
    Par défaut Liste d'initialisation dans les constructeurs
    Je me pose une question concernant les listes d'initialisation dans le constructeur d'une classe. Si la classe (Class1) contient beaucoup d'attributs membres qui sont des instances d'autres classes (Class2, Class3, Class4). Supposons que ces autres classes ne possèdent pas de constructeur sans argument. Alors nous sommes obligés d'utiliser une liste d'initialisation dans le constructeur de Class1 pour initialiser ses membres.

    Le code ressemblerait à ceci :

    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
     
    class Class1 {
        private :
            Class2 objet1;
            Class3 objet2;
            Class4 objet4;
     
        public :
            Class1();
    };
     
    // Constructeur de la classe Class1
    Class1::Class1()
              :objet1(...), objet2(...), objet4(...) {
     
    }
    Il me semble que si l'on a beaucoup d'attribut membres de ce genre, cela devient vite un peu fastidieux d'avoir des énormes listes d'initialisation de ce genre. Donc la question que je me pose dans ce genre de situation. Faut-il prévoir un constructeur par défaut au classes (Class1, Class2, Class3) ou bien il faut quand même utiliser les listes d'initialisation ?

    Merci d'avance de m'éclairer un peu sur votre façon de faire.

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Il me semble que si l'on a beaucoup d'attribut membres de ce genre, cela devient vite un peu fastidieux d'avoir des énormes listes d'initialisation de ce genre. Donc la question que je me pose dans ce genre de situation. Faut-il prévoir un constructeur par défaut au classes (Class1, Class2, Class3)
    Surtout pas !
    Rajouter un constructeur par défaut juste parce que tu trouves ça plus pratique à initialiser dans une autre classe, c'est n'importe quoi !

    ou bien il faut quand même utiliser les listes d'initialisation ?
    Oui, il faut.
    Si c'est trop lourd à écrire, c'est sûrement parce que tu as trop de membres ou trop de code. Si tu as trop de code, tu écris des fonctions, si tu as trop de membres, il faut créer d'autres classes.
    Boost ftw

  3. #3
    screetch
    Invité(e)
    Par défaut
    tu n'es pas obligé de tout coller sur la meme ligne. j'utilise en general cette syntaxe :

    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
    class Class1
    {
        private :
            Class2 objet1;
            Class3 objet2;
            Class4 objet4;
     
        public :
            Class1();
    };
     
    // Constructeur de la classe Class1
    Class1::Class1()
              :        objet1(...)
              ,        objet2(...)
              ,        objet4(...)
    {
    }
    mais comme le dit loufoque, ajouter des constructeurs par feignantise d'ecrire, c'est mal. au pire, met des valeurs par defaut sur tes parametres si ca a un sens.

  4. #4
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Il y a deux nouveautés du C++0x qui devraient te plaire Dani3l

    Initialisation par défaut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class Class1
    {
    public:
       Class1(); // appelle aussi number(42), hash("md5")
       Class1(int newNumber) : number(newNumber){} // appelle aussi hash("md5")
       Class1(int newNumber, string hashFunction) : number(newNumber), hash(hashFunction){} 
    private:
       int number = 42;
       Hash hash = Hash("md5");
    }
    Constructeur pouvant appeler d'autres constructeurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class Class1
    {
    public:
       Class1() : Class1(42){}
       Class1(int newNumber) : number(newNumber){} 
    private:
       int number;
    }

  5. #5
    Membre à l'essai
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    32
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    Ok merci beaucoup pour vos réponses. C'est plus clair maintenant.

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/01/2015, 14h34
  2. Débutant dans les constructeurs
    Par dot-_-net dans le forum C++
    Réponses: 16
    Dernier message: 31/03/2008, 22h24
  3. [X] Utilisation des listes de parametres dans les commandes
    Par axel-erator dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 29/06/2007, 12h00
  4. Réponses: 18
    Dernier message: 28/02/2007, 10h23
  5. Réponses: 6
    Dernier message: 26/06/2006, 23h49

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