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 :
Ne compile pas puisque le constructeur de A est privé.
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; }
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() :
Ca 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
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; }
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) :
Qui indiquerait donc que le constructeur pourrait être appelé uniquement par la methode 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 class A { private: A() friend A* 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)








Répondre avec citation






(nan sérieusement, je n'en sais rien).



Partager