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

Langage C++ Discussion :

Instancier une classe donnée dans une autre classe


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut Instancier une classe donnée dans une autre classe
    Bonjour à toutes et à tous,

    J'ai une problème d'instanciation. Je dispose d'une classe de base A et de deux classes enfants de A : B et C.
    Je crée enfin une classe D enfant de B et dans laquelle je souhaite avoir une instance de C. C'est là que je n'y arrive 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
    class A {
      A();
    };
     
    class B : public A {
      B(int);
    };
     
    class C : public A {
      C(int, int);
    };
     
    class D : public B {
      D(int, int, int);
      C c(int,int); // une instance de C ???
    };
     
    D::D(int a, int b, int c) : B(int) {
    // je suppose que c'est ici que je dois instancier C, mais après avoir essayé divers trucs, je m'aperçois que je ne sais pas faire
    }

    Jusque là, ça colle. Mais apparemment, si la dernière ligne de la classe D déclare une classe C en son sein, pour autant, cette déclaration ne constitue pas une instanciation de cette classe. Comment faire pour qu'il y ait instanciation ?

    Merci de votre aide.

    Pierre

  2. #2
    Membre expérimenté
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Par défaut
    Bonsoir,
    L'instanciation de C se fera dans le constructeur de la classe D.
    Cependant comme dans ta classe C, il n'y a pas de constructeur par défaut, il te faut déclarer un pointeur sur la classe C dans la classe D.

    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
    class A {
    public :
      A();
    };
     
    class B : public A {
    public:    // Le constructeur doit être public
      B(int);
    };
     
    class C : public A {
    public : 
      C(int, int);
    };
     
    class D : public B {
    public :
      D(int, int, int);
    private :   // Afin de respecter le principe d'encapsulation des données (notion de langage objet) il est préférable de déclarer les membres de ta classe en private ou protected.
      C* c; // L'absence de constructeur sans argument t'oblige à utiliser un pointeur
    };
     
    D::D(int a, int b, int c) : B(b) {
      c = new C(a,c);
    }
    Attention il te faut penser à mettre le mot clé avant de déclarer tes constructeurs, sinon ceux-ci seront privés.

    La différence entre private et protected tiens dans le fait que lors de l'héritage, tous ce qui est private (sauf dans le cas d'un héritage private) n'est pas accessible par la classe fille alors que tous ce qui est protected est accessible dans la classe fille.

    J'espère être assez clair. Sinon n'hésite pas le dire.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 152
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    Si tu veux créer un C, pourquoi écrire un prototype de méthode qui retourne un C ?
    Tu ignores la syntaxe d'ajout d'un membre à une classe ?

    // L'absence de constructeur sans argument t'oblige à utiliser un pointeur
    Faux. Il suffit d'utiliser la liste d'initialisation !
    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.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Par défaut
    Citation:
    // L'absence de constructeur sans argument t'oblige à utiliser un pointeur
    Faux. Il suffit d'utiliser la liste d'initialisation !
    Peux-tu illustrer ton propos à l'aide d'un exemple s'il te plait.

  5. #5
    Membre Expert
    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
    Par défaut
    Citation Envoyé par AF_2.8 Voir le message
    Peux-tu illustrer ton propos à l'aide d'un exemple s'il te plait.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class D: public B {
    public:
      D(int, int, int);
    private:
      C c;
    };
     
    D::D(int a, int b, int c):
      B(b), c(a, c)
    {
     
    }

  6. #6
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Merci Iradrille pour cet exemple fonctionnel.

    Donc, si je comprends bien, la liste d'initialisation est ce qui est après les ":" du constructeur. Cela comprend l'initialisation du parent et des classes utilisées.

    Oui, non ?

    Cordialement.

    Pierre

  7. #7
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Bonjour

    Je reviens sur ce problème de création d'une instance dans une autre instance. Iradrille a donné la solution suivante qui est tout à fait fonctionnelle :

    Citation Envoyé par Iradrille Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class D: public B {
    public:
      D(int, int, int);
    private:
      C c;
    };
     
    D::D(int a, int b, int c):
      B(b), c(a, c)
    {
     
    }
    Je complique un peu le problème en ce sens où je souhaite que l'instanciation de C dans D soit conditionnelle. Autrement dit, lorsque j'instancie D, je ne souhaite pas toujours y inclure une classe C.

    Apparemment, on ne peut pas mettre de code dans la liste d'initialisation. Avez-vous une idée de comment faire ?

    Merci de votre aide.

    Pierre

  8. #8
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    @ A.F_2.8 : si je fais ce que tu me dis, j'obtiens l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sketch_sep17a.ino: In constructor 'D::D(int, int, int)':
    sketch_sep17a:24: error: invalid conversion from 'C*' to 'int'
    sur la ligne :

    J'avoue ne pas comprendre !

    @ Bousk :tu dis : Si tu veux créer un C, pourquoi écrire un prototype de méthode qui retourne un C ? Parce que ce prototype (la classe D si j'ai bien compris ce que tu veux dire) fait aussi autre chose.

    tu dis aussi : Tu ignores la syntaxe d'ajout d'un membre à une classe ? Ben ... apparemment oui !

    et encore : Faux. Il suffit d'utiliser la liste d'initialisation ! Je n'ai pas réussi à comprendre en quoi cela consistait. Beaucoup de liens indiquent que c'est nécessaire mais je n'en ai pas trouvé qui explique clairement ce que c'est.

    Merci de votre aide.

    Pierre

  9. #9
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Au passage, je vous explique ce que je fais.

    Ma classe A est la classe de base de composants visuels.

    La classe B en dérive, c'est un Bouton

    La classe C en dérive aussi, c'est une fenêtre d'édition

    La classe D est un clavier. Comme c'est un ensemble de boutons, il est normal que cette classe dérive de la classe Bouton. Mais au dessus des touches du clavier, je veux afficher une fenêtre dans laquelle vont apparaître les codes des touches appuyées. Cet afficheur est un composant de la classe C. La classe D utilise donc un composant de la classe C.

    Cordialement.

    Pierre

  10. #10
    Membre expérimenté
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Au passage, je vous explique ce que je fais.

    Ma classe A est la classe de base de composants visuels.

    La classe B en dérive, c'est un Bouton

    La classe C en dérive aussi, c'est une fenêtre d'édition

    La classe D est un clavier. Comme c'est un ensemble de boutons, il est normal que cette classe dérive de la classe Bouton. Mais au dessus des touches du clavier, je veux afficher une fenêtre dans laquelle vont apparaître les codes des touches appuyées. Cet afficheur est un composant de la classe C. La classe D utilise donc un composant de la classe C.

    Cordialement.

    Pierre
    Vue ce que tu décris, je n'aurais pas implémenté ma classse D de la sorte.
    D est un clavier, un clavier n'est pas un bouton, un clavier est composé de boutons, il ne doit donc pas hérité de Bouton, mais avoir un tableau de boutons dans ses membres.
    Car en faisant D un fils de B, il ne sera affiché qu'un seul bouton.

  11. #11
    Membre expérimenté
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Par défaut
    Citation Envoyé par ChPr Voir le message
    @ A.F_2.8 : si je fais ce que tu me dis, j'obtiens l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sketch_sep17a.ino: In constructor 'D::D(int, int, int)':
    sketch_sep17a:24: error: invalid conversion from 'C*' to 'int'
    sur la ligne :

    J'avoue ne pas comprendre !
    Pierre
    C'est de ma faute, j'ai été un peu vite, dans le prototype, un des entier s'appelle c, il masque donc le membre c, il faut toujours faire attention à ce que les paramètres d'une fonction ne porte pas le même nom que des membres de la classe car sinon ils masquent les membres de la classe.
    L'idéal est de compiler avec tous les warnings, car le compilateur signalera ce problème

  12. #12
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par AF_2.8 Voir le message
    ... L'idéal est de compiler avec tous les warnings, car le compilateur signalera ce problème
    Je ne pense pas que l'éditeur d'Arduino propose cette option, mais je vais m'en assurer.

    Cordialement.

    Pierre

Discussions similaires

  1. Recherche des données dans une BD ou dans une List
    Par mesken dans le forum Hibernate
    Réponses: 3
    Dernier message: 15/05/2011, 16h45
  2. Réponses: 8
    Dernier message: 05/04/2011, 08h06
  3. [XL-2003] Récupération des données dans une base à partir d'une valeur donnée
    Par mandrake57 dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 01/04/2011, 14h33
  4. Réponses: 9
    Dernier message: 10/02/2010, 18h30
  5. Réponses: 7
    Dernier message: 03/12/2008, 15h18

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