En C, il est possible de définir des classes comme amies d'autres classes, accordant l'accès aux membres privés quelle que soit l'encapsulation . Cependant, lorsqu'il s'agit de modèles de classe, comprendre les relations amicales sous-jacentes devient crucial.
Considérez l'exemple de code :
template<class T> class BE { T *data; BE *l, *r; public: template<class U> friend class BT; }; template<class T> class BT { BE<T> *root; public: ... private: ... };
Ce code définit une classe BE représentant les éléments de l'arbre et une classe BT représentant un arbre binaire. Initialement, on a tenté de déclarer la classe d'amis comme :
template<class T> friend class BT;
Cependant, cette approche a échoué. Pour comprendre pourquoi, il est essentiel de reconnaître que les paramètres d’un modèle ne peuvent pas se masquer mutuellement. Dans les modèles imbriqués, chaque niveau doit avoir des noms de paramètres de modèle uniques.
En revanche, considérez cette déclaration :
template<class T> class BE { template<class U> friend class BT<U>; };
Cela signifie que BT est un ami de BE quels que soient les arguments du modèle de BT. Chaque instance de BT, quel que soit le type qu'elle stocke, sera une amie de BE.
Alternativement, si la déclaration suivante est utilisée :
template<class T> class BE { friend class BT<T>; };
Cela signifie que BT n'est qu'un ami de BE lorsque l'argument du modèle de BT correspond à celui de BE. Dans ce cas, par exemple, BT
Dans le cas de l'exemple d'arbre binaire, déclarer la classe amie comme classe amie BT
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!