Comment definir une fonction friend d'une classe privee?
4 réponses
Ghislain Lemaur
Bonjour a tous,
Le code source ci-dessous ne compile pas avec gcc.
Ce que je veux faire est declarer une fonction friend d'une
classe imbriquee et privee. Le probleme se pose lors de la
definition de la fonction amie.
Comment puis-je faire? Faut-il ajouter la fonction en static
dans la classe superieure? (je prefererais eviter ca)
Merci
Ghislain Lemaur
source:
#include <iostream>
class A{
public:
void action();
private:
class B{
friend std::ostream& operator << (std::ostream&, B&);
};
B b;
};
private.cpp: In function `std::ostream& operator<<(std::ostream&, A::B&)':
private.cpp:7: error: `class A::B' is private
private.cpp:13: error: within this context
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Laurent Ricci
Bonjour Ghislain,
Le probleme n'est pas seulement d'autoriser l'access aux donnees privees de la classe B (ce que fait le friend std::ostream& operator << (std::ostream&, B&)) mais d'autoriser l'access a la classe B qui est une definition privee de A. Tu dois ajouter un friend std::ostrem... dans la classe A:
class A{ public: void action(); private: class B{ friend std::ostream& operator << (std::ostream&, B&); }; B b; friend std::ostream& operator << (std::ostream&, B&); };
Ce qui a le desavantage de rendre l'ensemble de la classe A accessible.
Laurent
"Ghislain Lemaur" wrote in message news:bvt57v$7ir$
Bonjour a tous,
Le code source ci-dessous ne compile pas avec gcc. Ce que je veux faire est declarer une fonction friend d'une classe imbriquee et privee. Le probleme se pose lors de la definition de la fonction amie. Comment puis-je faire? Faut-il ajouter la fonction en static dans la classe superieure? (je prefererais eviter ca)
Merci
Bonjour Ghislain,
Le probleme n'est pas seulement d'autoriser l'access aux donnees privees
de la classe B (ce que fait le friend std::ostream& operator <<
(std::ostream&, B&))
mais d'autoriser l'access a la classe B qui est une definition privee de A.
Tu dois
ajouter un friend std::ostrem... dans la classe A:
class A{
public:
void action();
private:
class B{
friend std::ostream& operator << (std::ostream&, B&);
};
B b;
friend std::ostream& operator << (std::ostream&, B&);
};
Ce qui a le desavantage de rendre l'ensemble de la classe A accessible.
Laurent
"Ghislain Lemaur" <ghislain.dot.lemaur.AT@crmm.umh.ac.be> wrote in message
news:bvt57v$7ir$2@naxos.belnet.be...
Bonjour a tous,
Le code source ci-dessous ne compile pas avec gcc.
Ce que je veux faire est declarer une fonction friend d'une
classe imbriquee et privee. Le probleme se pose lors de la
definition de la fonction amie.
Comment puis-je faire? Faut-il ajouter la fonction en static
dans la classe superieure? (je prefererais eviter ca)
Le probleme n'est pas seulement d'autoriser l'access aux donnees privees de la classe B (ce que fait le friend std::ostream& operator << (std::ostream&, B&)) mais d'autoriser l'access a la classe B qui est une definition privee de A. Tu dois ajouter un friend std::ostrem... dans la classe A:
class A{ public: void action(); private: class B{ friend std::ostream& operator << (std::ostream&, B&); }; B b; friend std::ostream& operator << (std::ostream&, B&); };
Ce qui a le desavantage de rendre l'ensemble de la classe A accessible.
Laurent
"Ghislain Lemaur" wrote in message news:bvt57v$7ir$
Bonjour a tous,
Le code source ci-dessous ne compile pas avec gcc. Ce que je veux faire est declarer une fonction friend d'une classe imbriquee et privee. Le probleme se pose lors de la definition de la fonction amie. Comment puis-je faire? Faut-il ajouter la fonction en static dans la classe superieure? (je prefererais eviter ca)
Merci
Ghislain Lemaur
Le probleme n'est pas seulement d'autoriser l'access aux donnees privees de la classe B (ce que fait le friend std::ostream& operator << (std::ostream&, B&)) mais d'autoriser l'access a la classe B qui est une definition privee de A.
Tu dois ajouter un friend std::ostrem... dans la classe A:
class A{ public: void action(); private: class B{ friend std::ostream& operator << (std::ostream&, B&); }; B b; friend std::ostream& operator << (std::ostream&, B&); };
Ce qui a le desavantage de rendre l'ensemble de la classe A accessible.
Merci pour la solution. Mais je ne souhaite pas rendre visible
toute la classe A. Le mieux alors c'est peut-etre de rendre la definition de B publique. Y a-t-il une autre solution?
Ghislain
Le probleme n'est pas seulement d'autoriser l'access aux donnees privees
de la classe B (ce que fait le friend std::ostream& operator <<
(std::ostream&, B&))
mais d'autoriser l'access a la classe B qui est une definition privee de
A.
Tu dois
ajouter un friend std::ostrem... dans la classe A:
class A{
public:
void action();
private:
class B{
friend std::ostream& operator << (std::ostream&, B&);
};
B b;
friend std::ostream& operator << (std::ostream&, B&);
};
Ce qui a le desavantage de rendre l'ensemble de la classe A accessible.
Merci pour la solution. Mais je ne souhaite pas rendre visible
toute la classe A. Le mieux alors c'est peut-etre de rendre la definition
de B publique. Y a-t-il une autre solution?
Le probleme n'est pas seulement d'autoriser l'access aux donnees privees de la classe B (ce que fait le friend std::ostream& operator << (std::ostream&, B&)) mais d'autoriser l'access a la classe B qui est une definition privee de A.
Tu dois ajouter un friend std::ostrem... dans la classe A:
class A{ public: void action(); private: class B{ friend std::ostream& operator << (std::ostream&, B&); }; B b; friend std::ostream& operator << (std::ostream&, B&); };
Ce qui a le desavantage de rendre l'ensemble de la classe A accessible.
Merci pour la solution. Mais je ne souhaite pas rendre visible
toute la classe A. Le mieux alors c'est peut-etre de rendre la definition de B publique. Y a-t-il une autre solution?
Ghislain
Laurent Ricci
"Ghislain Lemaur" wrote in message news:bvtf4t$gns$
Ce qui a le desavantage de rendre l'ensemble de la classe A accessible.
Merci pour la solution. Mais je ne souhaite pas rendre visible
toute la classe A. Le mieux alors c'est peut-etre de rendre la definition de B publique. Y a-t-il une autre solution?
Ghislain
Effectivement la meilleure solution est de rendre la definition de B
publique dans la classe A tout en conservant le membre b privé.
Laurent
"Ghislain Lemaur" <ghislain.dot.lemaur.AT@crmm.umh.ac.be> wrote in message
news:bvtf4t$gns$1@naxos.belnet.be...
Ce qui a le desavantage de rendre l'ensemble de la classe A accessible.
Merci pour la solution. Mais je ne souhaite pas rendre visible
toute la classe A. Le mieux alors c'est peut-etre de rendre la definition
de B publique. Y a-t-il une autre solution?
Ghislain
Effectivement la meilleure solution est de rendre la definition de B
publique dans la classe A tout en conservant le membre b privé.
"Ghislain Lemaur" wrote in message news:bvtf4t$gns$
Ce qui a le desavantage de rendre l'ensemble de la classe A accessible.
Merci pour la solution. Mais je ne souhaite pas rendre visible
toute la classe A. Le mieux alors c'est peut-etre de rendre la definition de B publique. Y a-t-il une autre solution?
Ghislain
Effectivement la meilleure solution est de rendre la definition de B
publique dans la classe A tout en conservant le membre b privé.
Laurent
Frederic Py
Laurent Ricci wrote:
"Ghislain Lemaur" wrote in message news:bvtf4t$gns$
Ce qui a le desavantage de rendre l'ensemble de la classe A accessible.
Merci pour la solution. Mais je ne souhaite pas rendre visible toute la classe A. Le mieux alors c'est peut-etre de rendre la definition de B publique. Y a-t-il une autre solution?
Ghislain
Effectivement la meilleure solution est de rendre la definition de B publique dans la classe A tout en conservant le membre b privé.
Laurent
Ou de faire un truc de ce genre :
class A_alpha { protected: class B { friend std::ostream &operator <<(std::ostream &, B &); }; friend std::ostream &operator <<(std::ostream &, B &); };
class A: public A_alpha { public: void action();
private: B b; };
Ainsi le probleme d'accés a A est réglé ;)
-- Frédéric Py
Laurent Ricci wrote:
"Ghislain Lemaur" <ghislain.dot.lemaur.AT@crmm.umh.ac.be> wrote in message
news:bvtf4t$gns$1@naxos.belnet.be...
Ce qui a le desavantage de rendre l'ensemble de la classe A accessible.
Merci pour la solution. Mais je ne souhaite pas rendre visible
toute la classe A. Le mieux alors c'est peut-etre de rendre la definition
de B publique. Y a-t-il une autre solution?
Ghislain
Effectivement la meilleure solution est de rendre la definition de B
publique dans la classe A tout en conservant le membre b privé.
Laurent
Ou de faire un truc de ce genre :
class A_alpha {
protected:
class B {
friend std::ostream &operator <<(std::ostream &, B &);
};
friend std::ostream &operator <<(std::ostream &, B &);
};
"Ghislain Lemaur" wrote in message news:bvtf4t$gns$
Ce qui a le desavantage de rendre l'ensemble de la classe A accessible.
Merci pour la solution. Mais je ne souhaite pas rendre visible toute la classe A. Le mieux alors c'est peut-etre de rendre la definition de B publique. Y a-t-il une autre solution?
Ghislain
Effectivement la meilleure solution est de rendre la definition de B publique dans la classe A tout en conservant le membre b privé.
Laurent
Ou de faire un truc de ce genre :
class A_alpha { protected: class B { friend std::ostream &operator <<(std::ostream &, B &); }; friend std::ostream &operator <<(std::ostream &, B &); };