boost實用工具:創建一個禁止復制的類 noncopyable
阿新 • • 發佈:2017-06-16
它的 手寫 生成 prot x11 編譯 實用 idt mes
boost的noncopyable允許創建一個禁止復制的類,使用很簡單,但很好用!
C++ Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
/* boost_noncopyable.cpp 創建一個禁止復制的類 noncopyable允許程序輕松實現一個禁止復制的類; */ #include <iostream> #include <boost/noncopyable.hpp> // 或#include <boost/utility.hpp> using namespace std; using namespace boost; //在C++中定義一個類的時候,如果不明確定義拷貝構造函數和拷貝復制操作符,編譯器會為我們自動生成 //但有時候我們不需要類的復制語義,希望禁止復制類的實例 //這是一個很經典的C++慣用語法,只要私有化拷貝構造函數和拷貝賦值操作函數即可 //如果程序中有大量這樣的類,重復寫這樣的代碼是相當乏味的,而且代碼出現的次數越多越容易增加手寫出錯的幾率 { public: empty_class() {} ~empty_class() {} //編譯器默認添加拷貝構造函數和拷貝賦值函數 empty_class(const empty_class & ) {} empty_class &operator=(const empty_class &) {} protected: private: }; class noncopy_class { public: noncopy_class() {} ~noncopy_class() {} private: //私有化拷貝構造函數和拷貝賦值函數,禁止復制類 noncopy_class(const noncopy_class & ) {} noncopy_class &operator=(const noncopy_class &) {} }; //針對以上情況,boost中的noncopyable為實現不可拷貝類提供了簡單清晰的解決方案 //從boost::noncopyable派生即可 /* class noncopyable { protected: #if !defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) && !defined(BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS) BOOST_CONSTEXPR noncopyable() = default; ~noncopyable() = default; #else noncopyable() {} ~noncopyable() {} #endif #if !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) noncopyable( const noncopyable& ) = delete; noncopyable& operator=( const noncopyable& ) = delete; #else private: // emphasize the following members are private noncopyable( const noncopyable& ); noncopyable& operator=( const noncopyable& ); #endif }; } typedef noncopyable_::noncopyable noncopyable; */ class do_not_copy_class : noncopyable { public: protected: private: }; int main(void) { empty_class em_c1; empty_class em_c2(em_c1); empty_class em_c3 = em_c1; noncopy_class noc_c1; //error C2248: ‘noncopy_class::noncopy_class‘ : cannot access private member declared in class ‘noncopy_class‘ //noncopy_class noc_c2(noc_c1) ; //noncopy_class noc_c3 = noc_c1; do_not_copy_class d1; //error C2248: ‘boost::noncopyable_::noncopyable::noncopyable‘ : cannot access private member declared in class ‘boost::noncopyable_::noncopyable‘ //do_not_copy_class d2(d1); //do_not_copy_class d3 = d1; //只要有可能就使用boost::noncopyable,它明確無誤地表達了類設計者的意圖; //對用戶更加友好,而且與其它的boost庫配合的也好 cin.get(); return 0; } |
boost實用工具:創建一個禁止復制的類 noncopyable