Pouvons-nous améliorer la réutilisabilité du modèle de protection d'accès orienté clé ?
Dans sa forme actuelle, le modèle de protection d'accès utilisant des clés présente limites dans sa réutilisation. Pour résoudre ce problème, diverses améliorations ont été proposées.
Améliorations C 03 :
À l'aide de macros, nous pouvons simplifier et généraliser le modèle. Les macros PASSKEY définissent des clés d'accès pour des classes ou des fonctions spécifiques, fournissant ainsi un emplacement centralisé pour la gestion du contrôle d'accès. Voici un exemple :
#define PASSKEY_1(pKeyname, pFriend1) \ class EXPAND(pKeyname) \ { \ private: \ friend EXPAND(pFriend1); \ EXPAND(pKeyname)() {} \ \ EXPAND(pKeyname)(const EXPAND(pKeyname)&); \ EXPAND(pKeyname)& operator=(const EXPAND(pKeyname)&); \ }
Bien que cette méthode améliore la facilité d'utilisation du modèle, elle présente des inconvénients. Cela oblige les appelants à connaître le mot de passe spécifique requis et peut conduire à un encombrement macro.
Améliorations C 0x :
En C 0x, le modèle peut atteindre son plus grand potentiel grâce aux modèles variadiques et aux amis des paramètres de modèle. Voici une implémentation :
template <typename T> class passkey { private: friend T; // Now possible in C++0x passkey() {} // Noncopyable passkey(const passkey&) = delete; passkey& operator=(const passkey&) = delete; }; #define PASSKEY_FUNCTION(pTag, pFunc, ...) \ struct EXPAND(pTag); \ \ template <> \ class passkey<EXPAND(pTag)> \ { \ private: \ friend pFunc __VA_ARGS__; \ passkey() {} \ \ passkey(const passkey&) = delete; \ passkey& operator=(const passkey&) = delete; \ }
Maintenant, chaque classe a sa clé d'accès unique et les fonctions peuvent spécifier leurs clés d'accès autorisées. Les appelants créent simplement le mot de passe nécessaire et invoquent la méthode souhaitée. Cette approche offre une réutilisabilité et une flexibilité accrues grâce à sa mise en œuvre générique.
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!