salut,
la clause friend donne accès aux membres privés d'une classe à une autre classe.
J'aimerai restreindre cet accès à un seul membre et pas à l'ensemble des membres privés.
Est-ce possible ?
salut,
la clause friend donne accès aux membres privés d'une classe à une autre classe.
J'aimerai restreindre cet accès à un seul membre et pas à l'ensemble des membres privés.
Est-ce possible ?
C'est possible en feintant. Exemple qui vaut un long discours.
Bref, la question est : "Est-ce que cela en vaut la peine ?" Il faut voir si les rôles se regroupent bien par couches ou non.
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
39
40
41
42
43 /** But : tester comment mettre en oeuvre une amitié sélective. * ie.: faire en sorte qu'un membre m_i ne soit accessible qu'à une * seule fonction f_i() et que cette dernière n'ait accès qu'à m_i. */ #include <iostream> #include <string> using namespace std; struct empty {}; template <class Super> class Role1 : public Super { template <class T> friend void f1(T&t); friend void f1bis<>(Role1&); const string m1() { return "Méthode 1"; } }; template <class Super> class Role2 : public Super { template <class T> friend void f2(T&t); const string m2() { return "Méthode 2"; } }; typedef Role1<Role2<empty> > TYPE; template <class T> void f1(T&t) { cout << t.m1() << endl; } template <class T> void f2(T&t) { cout << t.m2() << endl; } /*template <class T> void f2(T&t) { cout << t.m1() << t.m2() << endl; }*/ template <class R> void f1bis(R&t) { cout << t.m1() << endl; } int main (int argc, char **argv) { TYPE toto; f1(toto); f1bis(toto); f2(toto); }
Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...
Pas directement je pense.
Mais tu peux faire quelque chose de ce genre:
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 class B; class A { private: int _a; int _b; friend void B::set_a(&A, int); }; class B { void set_a(&A a, int i) { A._a = i; } };
Partager