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 avec constructeurs


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Problème avec constructeurs
    Bonjour. Je suis étudiante en école d'ingés et j'ai un projet à réaliser en langage c++ dans le cadre de mon cours d'informatique. C'est de la POO, que nous venons de commencer et je suis encore un peu perdue. Ma question est la suivante : si j'ai dans une classe, un des attributs qui se trouve être lui-même un objet (ou plutôt une instance d'une (autre) classe), comment je peux initialiser cet attribut dans le constructeur ? Est-ce que je dois simplement recopier le constructeur de l'autre classe dans la section deux points ? Et si l'autre classe contient elle-même des attributs qui sont des objets ? Je me retrouverais à recopier deux constructeurs dans un troisième constructeur ? J'espère que ma question n'est pas trop fumeuse. Je suis prête à la reformuler si elle n'est pas assez claire

    Merci beaucoup !

  2. #2
    Nouveau membre du Club
    Inscrit en
    Février 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Février 2005
    Messages : 36
    Points : 26
    Points
    26
    Par défaut
    Je ne sais pas si j'ai tout compris mais j'essaye de répondre

    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 A{
     
    public :
         A(string);
     
    }
     
    class B{
     
    public :
          B();
          A a;
    }
     
    B::B(): a("init"){}

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Heuu... Si j'ai bien compris, dans cet exemple c'est la classe B qui va utiliser un attribut de classe A ? Mais, déjà où est la section private ? Vous avez juste omis de la mettre ou c'est pour une bonne raison qu'elle n'est pas là ? (Encore une fois, je débute ^^) Et dans la classe A, la ligne "A (string) ;" sous public est censée être un constructeur ? J'ai vraiment du mal à déchiffrer le code... Mais j'ai au moins à peu près compris comment s'est fait le constructeur de B. Merci !

  4. #4
    Nouveau membre du Club
    Inscrit en
    Février 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Février 2005
    Messages : 36
    Points : 26
    Points
    26
    Par défaut
    J'ecris une class B qui contient (utilise) une classe A qui a besoin d'un paramètre pour se construire

    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 A{
     
    public :
         A(string); // Le constructeur dans public
     
    }
     
    class B{
     
    public :
          B(); //constructeur classe B() sans parametre
          A a;// Déclaration d'un objet qui a besoin d'un paramètre, il pourrait être dans privée (donc écrit au dessus de public (une classe est par défaut privée))
    }
     
    B::B(): a("init"){} // à la construction de B il faut passer le paramètre de A (initialisation à la construction)
    Voilà j'espère que c'est plus claire, sinon je te conseille de lire au minimum les tutos du site.

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Bonsoir,
    Une petite précision pour le private.

    Les déclarations de classes commencent toujours implicitements par un private:, tandis que les structures commencent implicitement par public:.

    Ainsi, les trois déclarations suivantes sont strictement équivalentes entre elles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class A {
    private:
        int a;
    };
     
    class B {
        int a;
    };
     
    struct C {
    private:
        int a;
    };
    De même que les trois suivantes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class A {
    public:
        int a;
    };
     
    struct B {
    public:
        int a;
    };
     
    struct C {
        int a;
    };
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    De manière générale, on peut estimer qu'il y a trois possibilités "cumulatives" quant aux membres d'une classe:
    1. Ils peuvent disposer d'un constructeur par défaut (comprend: un constructeur ne prenant aucun argument)
    2. Ils peuvent disposer d'un (ou de plusieurs) constructeur(s) qui prennent un (ou plusieurs) argument(s)
    3. Ils peuvent disposer d'un constructeur par copie
    En fonction des constructeurs dont disposent les types utilisés pour les différents membres et du comportement que tu veux obtenir, il "suffit" d'utiliser le constructeur adéquat dans la liste d'initialisation:

    Par exemple, la classe std::string dispose (entre autres) du constructeur par défaut qui initialise la chaine de caractères à une chaine vide, d'un constructeur prenant un const char * et de constructeur par copie, ce sera donc l'exemple parfait de ce que je veux te montrer

    Tu peux très bien avoir une classe (ou une structure, car c'est pareil à la visibilité utilisée par défaut près ) proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class EmptyStringUser{
       public:
           EmtyStringUser(int data):data(data){ // fait automatiquement appel au
                                                // constructeur par défaut de std::string pour str
       private:
           int data;
           std::string str;
    };
    mais tu peux aussi créer une classe proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class DefinedStringUser{
        public:
            DefinedStringUser(int data): data(data),
                         str("this is a default value"){ // utilise le constructeur de std::string
                                                         // qui prend un const char * en parametre pour str
            }
        private:
           int data;
           std::string str;
    }
    Et, enfin, tu pourrais aussi envisager une classe proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class DefinedByUserStringUser{
     
        public:
            DefinedByUserStringUser(int data, std::string const & s): data(data),
                         str(s){ // utilise le constructeur par copie de std::string pour str
            }
        private:
           int data;
           std::string str;
    }
    Dans le premier cas, str sera initialisé à une valeur vide.

    Dans le deuxième cas, toutes les instances de DefinedStringUser::str seront initialisée à "this is a default value".

    Et, last but not least, dans le troisième cas, DefinedByUserStringUser::str sera initialisée à la valeur fournie lors de l'appel du constructeur ( par exemple à "ma valeur preferee" avec le code DefinedByUserStringUser obj(2,"ma valeur preferee"); )

    Pour le reste, il t'appartient évidemment de savoir ce qui t'intéresse le plus dans chaque situation que tu rencontre

    Note au passage que, comme tu peux parfaitement avoir plusieurs constructeurs différents pour autant qu'ils diffèrent par le nombre ou par le type des arguments qu'ils acceptent, tu pourais très bien avoir une classe qui ressemblerait à quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class MyClass{
        public:
            MyClass(int data):data(data),str("default value"){ //comme le deuxième cas
            }
            MyClass(int data, std::string const & s):data(data),str(s){ // comme le troisième cas
            }
        private:
            int data;
            std::string str;
    };
    que tu pourrais alors utiliser sous deux formes distinctes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main(){
        MyClass obj1(3); // str="default value"
        MyClass other(4,"valeur specifique"); //str="valeur specifique"
        std::string got;
        std::cin>>got; //en fait, faudrait faire mieux que ca :-S
        MyClass last(5,got); //str = ... valeur introduite par l'utilisateur
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. problème avec constructeur
    Par humanite dans le forum Débuter
    Réponses: 27
    Dernier message: 13/01/2013, 18h35
  2. problème avec pointeur et constructeur
    Par matteli dans le forum C++
    Réponses: 2
    Dernier message: 24/02/2008, 16h11
  3. [Debutant] Problème avec un constructeur par copie
    Par Drannor dans le forum Débuter
    Réponses: 5
    Dernier message: 12/03/2007, 09h15
  4. problème de constructeur avec wxWidget
    Par Ardeciel dans le forum wxWidgets
    Réponses: 2
    Dernier message: 10/03/2007, 23h11
  5. [Conception]Problèmes avec un constructeur dérivé
    Par Le Furet dans le forum Langage
    Réponses: 6
    Dernier message: 10/03/2006, 09h44

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