[Langage] Fonction amie d'une autre fonction
Je sais que ce n'est pas possible, mais il m'arrive (quand je design certain type de systeme de classes) d'avoir envie qu'une seule et unique fonction de ma classe A soit accessible soit par une autre classe soit par une fonction spécifique. Si je me trompe pas, en c++ c'est impossible.
Exemple :
Code:
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 26 27 28 29 30 31 32 33 34 35 36
|
class A;
class B
{
public:
A* generateA();
};
class A
{
private:
A() {
}
};
A* B::generateA()
{
return new A;
}
int main()
{
B test;
A* a = test.generateA();
return 0;
} |
Ne compile pas puisque le constructeur de A est privé.
La seule solution c'est d'utiliser friend soit pour rendre accessible toute la classe A à toutes les methodes de B, soit uniquement a une methode de B : B::generateA() :
Code:
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 26 27 28 29 30 31 32 33 34 35 36 37 38
|
class A;
class B
{
public:
A* generateA();
};
class A
{
private:
friend A* B::generateA();
A() {
}
};
A* B::generateA()
{
return new A;
}
int main()
{
B test;
A* a = test.generateA();
return 0;
} |
Ca compile.
Je ne vois aucun moyen de faire ce dont je parlais au départ , qui reviendrait à avoir quelque chose comme un "friend" mais déclaré uniquement pour une méthode de A, pas pour toute la classe, comme par exemple (fictif) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
class A
{
private:
A() friend A* B::generateA() {
}
}; |
Qui indiquerait donc que le constructeur pourrait être appelé uniquement par la methode B::generateA() .
Maintenant les questions :
0) Ai-je faux? - je demande juste au cas où ya une règle planquée qui permet ça mais que j'ai pas trouvé dans les docs c++... normalement friend n'est possible que dans la déclaration d'une classe.
1) Est-ce qu'il existe un moyen détourné de faire ce que je veux? (j'en doute...)
2) Est-ce qu'il y a une raison purement théorique dans le langage qui fait que cette "feature" n'est pas possible? (c'est là ou je veux en venir)