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 : 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
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 : 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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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)