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 :

Constructeur de deux classe couplées


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut Constructeur de deux classe couplées
    Bonjour,

    Dans le livre de Scott Meyers à l'item 26, on a 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
     
    class B;//forward déclaration for class B
    class A{
    private:
    	int o;
    public:
     
    	A(const B& X); //an A can be constructed from a B
    };
     
    class B{  
    private:
    		int o;
    public:
    	 operator A() const;//a B can be converted to an A
    };
    On voit que le constructeur par copie de A permet de construire un objet A a partir d'un objet B. Alors j'ai voulu définir ce constructeur de A
    comme ceci:
    mais bien sur, o étant privé, on ne peut pas accéder aux données membres de B dans une fonction de la classe A.

    Je ne veux pas faire de classe dérivée, et déclarer les membres de B comme protected (ou l'inverse).

    Alors y a t il un moyen pour acceder à l'élément o de l'objet-argument autrement que par un accesseur déclaré comme ceci dans la classe A:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    friend int getteur (const B& );
    et défini comme ceci dans la classe B:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int getteur(const B& X){return X.o;};
    Merci

  2. #2
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Pourquoi ne pas déclarer A en friend de B directement ?

    Avec ton friend getter, tu exposes ta propriété à tout le monde (pas seulement A) --> autant mettre directement le getter public dans la classe.

  3. #3
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    En fait, j'ai fait ca: J'ai déclaré friend à l'intérieur de la classe A.
    Ce code compile:
    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 B;//forward déclaration for class B
     
    class B{  
     
    private:
    		int o;
    public:
    	B(int x):o(x){};
    	int getteur()const {return o;} ;
    	 //operator A() const;//a B can be converted to an A
    };
     
    class A{
    	friend class B; 	
    private:
    	int o;
    public:
     	A();
    	  friend int getteur( ) ;
    	A(const B& X) {
    		int o=X.getteur();
    	}
    	 //A(const B&);  
    	  //an A can be constructed from a B
    };
    Alors que si j'inverse les deux classes, j'ai comme erreur:
    error C2027: use of undefined type 'B'
    alors que j'ai bien déclaré la classe B tout au début, avant la définition de la classe A. :???

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Une petite remarque de sémantique...

    Ici, tu ne définis pas un constructeur par copie, mais bien un constructeur... prenant une référence constante sur un objet de type B.

    La diffrérence tient, simplement, au fait que tu... ne crée pas une copie de ton objet A, vu qu'à la base, tu as un objet B

    Autrement, la solution passe sans doute effectivement par l'amitié, ainsi que l'a fait valoir white_tentacle
    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

  5. #5
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Autrement, la solution passe sans doute effectivement par l'amitié, ainsi que l'a fait valoir white_tentacle
    J'ai essayé une seconde fois, en utilisant l'amitié comme conseillé, cela marche effectivement.
    Je suis d'accord, il ne s'agitpas de constructeur par copie.
    En revanche, s'agit t il d'une référence sur une constante, ou d'une référence constante?

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par deubelte Voir le message
    J'ai essayé une seconde fois, en utilisant l'amitié comme conseillé, cela marche effectivement.
    Je suis d'accord, il ne s'agitpas de constructeur par copie.
    En revanche, s'agit t il d'une référence sur une constante, ou d'une référence constante?
    Bien qu'il s'agisse en réalité d'un abus de langage, cela revient strictement au même...

    Certains pinaillent sur le fait qu'une fois qu'une référence est définie, elle ne peut plus représenter un autre objet que celui référencé pour dire qu'une référence est d'office constante, et préfèrent donc parler de "référence sur un objet constant".

    D'un autre coté, on peut faire valoir que ce n'est pas forcément parce qu'un
    fait que ref considère l'objet référencé (ici var) comme constant que l'objet est effectivement constant (il pourrait très bien avoir été déclaré comme... Type var )

    Ce qui est sur, quel que soit la manière dont on présente les choses, c'est que les deux termes signifient que l'on s'engage à ne pas modifier l'objet au travers de la référence
    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

  7. #7
    Membre très actif Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Par défaut typo
    Citation Envoyé par deubelte Voir le message
    En revanche, s'agit t il d'une référence sur une constante, ou d'une référence constante?
    Le truc c'est de lire de la droite vers la gauche. Ca donne:
    --> X est une référence sur un B constant

    Ce qui est la meme chose que:
    --> X est une référence sur un constant B

    --> X est une référence sur un B

    Je te laisse deviner ce que ça donne avec des pointers qui ont un degré de constness en plus par rapport aux références (&const est implicite) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    B const* X
    const B* X
    B* const X
    const B* const X
    B const * const X
    const B const * const X // bonus

Discussions similaires

  1. Réponses: 5
    Dernier message: 01/04/2008, 21h58
  2. Réponses: 5
    Dernier message: 20/11/2005, 11h15
  3. Réponses: 3
    Dernier message: 06/11/2005, 18h02
  4. Réponses: 5
    Dernier message: 17/08/2005, 12h40
  5. [Language]constructeur de sous classes
    Par seb888 dans le forum Langage
    Réponses: 12
    Dernier message: 04/06/2005, 22h37

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