Maison >développement back-end >C++ >Comment pouvons-nous améliorer la réutilisabilité du modèle de protection d'accès orienté clé en C ?
Réutilisabilité du modèle de protection d'accès orienté clé
Le modèle de protection d'accès orienté clé fournit un moyen concis et expressif de contrôler l'accès aux méthodes et fonctions basées sur des objets clés. Cependant, le modèle peut actuellement être limité en termes de réutilisabilité.
Améliorations de C 03
Une méthode pour améliorer la réutilisabilité dans C 03 consiste à utiliser des macros pour définir des groupes de clés d'accès. :
#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)&); \ } #define PASSKEY_2(pKeyname, pFriend1, pFriend2) \ class EXPAND(pKeyname) \ { \ private: \ friend EXPAND(pFriend1); \ friend EXPAND(pFriend2); \ EXPAND(pKeyname)() {} \ \ EXPAND(pKeyname)(const EXPAND(pKeyname)&); \ EXPAND(pKeyname)& operator=(const EXPAND(pKeyname)&); \ }
Cependant, cette méthode nécessite toujours que l'appelant connaisse le mot de passe spécifique dont il a besoin pour créer et peut être fastidieux pour créer des clés d'accès pour les fonctions.
Améliorations de C 0x
C 0x introduit des améliorations significatives au modèle de clé d'accès, permettant la génération complète de modèles. Grâce à des modèles variadiques et à l'amitié pour les paramètres de modèle, le code suivant présente l'implémentation améliorée :
// Each class has its own unique key only it can create template <typename T> class passkey { private: friend T; // C++0x, MSVC allows as extension passkey() {} // Noncopyable passkey(const passkey&) = delete; passkey& operator=(const passkey&) = delete; }; // Functions still require a macro. This is because a friend function requires // the entire declaration, which is not just a type, but a name as well. We do // this by creating a tag and specializing the passkey for it, friending the function #define EXPAND(pX) pX // We use variadic macro parameters to allow // functions with commas, it all gets pasted // back together again when we friend it #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; \ }
Cette implémentation améliorée élimine les deux inconvénients de la solution C 03 antérieure. L'appelant n'a plus besoin de deviner quel mot de passe utiliser, et le code passe-partout gère la création du mot de passe et l'amitié des fonctions de manière générique, nécessitant une définition supplémentaire minimale.
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!