Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comment definir une fonction friend d'une classe privee?

4 réponses
Avatar
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;
};

std::ostream& operator << (std::ostream& out, A::B& b){
out << "hello world";
}

void A::action(){
std::cout << b;
}

int main(){
A a;
a.action();
}

erreur de gcc:

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

4 réponses

Avatar
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



Avatar
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

Avatar
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


Avatar
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