Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Kami Boleh Meningkatkan Kebolehgunaan Semula Corak Perlindungan Akses Berorientasikan Kunci dalam C ?

Bagaimanakah Kami Boleh Meningkatkan Kebolehgunaan Semula Corak Perlindungan Akses Berorientasikan Kunci dalam C ?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-09 10:33:08719semak imbas

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

Kebolehgunaan semula Corak Perlindungan Akses Berorientasikan Kunci

Corak perlindungan akses berorientasikan kunci menyediakan cara ringkas dan ekspresif untuk mengawal akses kepada kaedah dan fungsi berdasarkan objek utama. Walau bagaimanapun, corak pada masa ini boleh dihadkan dari segi kebolehgunaan semula.

Peningkatan dalam C 03

Satu kaedah untuk meningkatkan kebolehgunaan semula dalam C 03 melibatkan penggunaan makro untuk menentukan kumpulan kunci laluan :

#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)&); \
        }

Walau bagaimanapun, kaedah ini masih memerlukan pemanggil mengetahui kunci laluan khusus yang perlu mencipta dan boleh menyusahkan untuk mencipta kunci laluan untuk fungsi.

Peningkatan dalam C 0x

C 0x memperkenalkan peningkatan ketara pada corak kunci laluan, membolehkan penjanaan templat lengkap. Melalui templat variadic dan persahabatan untuk parameter templat, kod berikut mempamerkan pelaksanaan yang dipertingkatkan:

// 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; \
        }

Pelaksanaan yang dipertingkatkan ini menghapuskan kedua-dua kelemahan penyelesaian C 03 terdahulu. Pemanggil tidak perlu lagi meneka kunci laluan yang hendak digunakan, dan kod plat dandang mengendalikan penciptaan kunci laluan dan fungsi berkawan secara umum, memerlukan definisi tambahan yang minimum.

Atas ialah kandungan terperinci Bagaimanakah Kami Boleh Meningkatkan Kebolehgunaan Semula Corak Perlindungan Akses Berorientasikan Kunci dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn