Wiederverwendbarkeit des schlüsselorientierten Zugriffsschutzmusters
Das schlüsselorientierte Zugriffsschutzmuster bietet eine prägnante und ausdrucksstarke Möglichkeit, den Zugriff zu steuern zu Methoden und Funktionen basierend auf Schlüsselobjekten. Allerdings kann das Muster derzeit hinsichtlich der Wiederverwendbarkeit eingeschränkt sein.
Verbesserungen in C 03
Eine Methode zur Verbesserung der Wiederverwendbarkeit in C 03 besteht in der Verwendung von Makros zur Definition von Passkey-Gruppen :
#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)&); \ }
Diese Methode erfordert jedoch immer noch, dass der Aufrufer den spezifischen Passkey kennt, der erstellt werden muss und sein kann umständlich für die Erstellung von Passkeys für Funktionen.
Verbesserungen in C 0x
C 0x führt erhebliche Verbesserungen am Passkey-Muster ein und ermöglicht die vollständige Vorlagengenerierung. Durch verschiedene Vorlagen und Freundschaft für Vorlagenparameter zeigt der folgende Code die verbesserte Implementierung:
// 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; \ }
Diese verbesserte Implementierung beseitigt beide Nachteile der früheren C 03-Lösung. Der Aufrufer muss nicht mehr erraten, welcher Passkey verwendet werden soll, und der Boilerplate-Code wickelt die Passkey-Erstellung und das Funktions-Friending generisch ab, sodass nur minimale zusätzliche Definitionen erforderlich sind.
Das obige ist der detaillierte Inhalt vonWie können wir die Wiederverwendbarkeit des schlüsselorientierten Zugriffsschutzmusters in C verbessern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!