Heim > Backend-Entwicklung > C++ > Wie können wir die Wiederverwendbarkeit des schlüsselorientierten Zugriffsschutzmusters in C verbessern?

Wie können wir die Wiederverwendbarkeit des schlüsselorientierten Zugriffsschutzmusters in C verbessern?

Mary-Kate Olsen
Freigeben: 2024-12-09 10:33:08
Original
740 Leute haben es durchsucht

How Can We Improve the Reusability of the Key-Oriented Access-Protection Pattern in C  ?

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)&); \
        }
Nach dem Login kopieren

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&amp;) = delete;
    passkey&amp; operator=(const passkey&amp;) = 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&amp;) = delete;            \
            passkey&amp; operator=(const passkey&amp;) = delete; \
        }
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage