/* IFT1169 - démonstration #03 - exercice 03 30-janvier -2006 v1.03 M.Lokbani - màj pour IFT1169 + gcc3.4.2 exemple pris de H. Garreta 31-octobre -2003 v1.02 M.Lokbani - gcc3.2 + comments 02-novembre -1999 v1.01 M.Lokbani - + comments 12-octobre -1999 v1.00 M.Lokbani - code & comments contact: lokbani@iro.umontreal.ca Copyright (C) 1999-2006 Université de Montréal Département d'informatique et de Recherche Opérationnelle Mohamed Lokbani -- Tous Droits Réservés -- All Rights Reserved -- Description: ------------ Description: Le but de cet exercice est de démontrer par la pratique quelques propriétés des fonctions amies : la symétrie et la transitivité. Symétrie: Si la classe A est amie de la classe B, n'implique pas que la classe B est amie de la classe A. Transitivité: Si la classe A est amie de la classe B et la classe B est amie de la classe C; n'implique pas que la classe A est amie de la classe C. */ #include using namespace std; class A; class B { int bb; public: B():bb(0) {}; friend class A; // A est amie de B donc elle a accès à tous les membres privés de B. void affiche (A&); }; class C; class A { int aa; public: A():aa(100) {}; void affiche (B&,C&); // On utilise B & C sachant que les deux classes ne sont pas amies de A. }; class C { int cc; public: C():cc(250) {}; friend class B; // B est amie de C donc elle a accès à tous les membres privés de C. }; void A::affiche(B& bp,C& cp){ cout << bp.bb << cp.cc << endl; } void B::affiche(A& ap){ cout << ap.aa << endl; } // Un exemple d'utilisation qui ne va pas compiler .... int main() { A ax; B bx; C cx; bx.affiche(ax); ax.affiche(bx,cx); return 0; } /* >g++ -Wall -pedantic -Os -c 1169demo03exo3Sol.cpp -o 1169demo03exo3Sol.o Ici on teste la transitivité: A est amie de B et B est amie de C, est-ce que A est amie de C. Si c'était le cas A aura accès aux membres privés de C. Dans cet exemple le compilateur nous informe que la méthode affiche de la classe A n'a pas le droit d'y accéder au membre privé de C. CQFD. 1169demo03exo3Sol.cpp: In member function `void A::affiche(B&, C&)': 1169demo03exo3Sol.cpp:59: error: `int C::cc' is private 1169demo03exo3Sol.cpp:66: error: within this context Ici on teste la symétrie: A est amie de B est-ce que B est amie de A? Si c'était le cas B aura accès aux membres privés de A. Dans cet exemple le compilateur nous informe que la méthode affiche de la classe B n'a pas le droit d'y accéder au membre privé de A. CQFD. 1169demo03exo3Sol.cpp: In member function `void B::affiche(A&)': 1169demo03exo3Sol.cpp:51: error: `int A::aa' is private 1169demo03exo3Sol.cpp:70: error: within this context >Exit code: 1 */