Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Kami Boleh Meningkatkan Kebolehgunaan Semula Corak Perlindungan Akses Berorientasikan Kunci dalam 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&) = 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; \ }
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!