boost实用工具:创建一个禁止复制的类 noncopyable
生活随笔
收集整理的這篇文章主要介紹了
boost实用工具:创建一个禁止复制的类 noncopyable
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
boost的noncopyable允許創(chuàng)建一個(gè)禁止復(fù)制的類,使用很簡(jiǎn)單,但很好用!
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?創(chuàng)建一個(gè)禁止復(fù)制的類 ????noncopyable允許程序輕松實(shí)現(xiàn)一個(gè)禁止復(fù)制的類; */ #include?<iostream> #include?<boost/noncopyable.hpp>?//?或#include?<boost/utility.hpp> using?namespace?std; using?namespace?boost; //在C++中定義一個(gè)類的時(shí)候,如果不明確定義拷貝構(gòu)造函數(shù)和拷貝復(fù)制操作符,編譯器會(huì)為我們自動(dòng)生成 //但有時(shí)候我們不需要類的復(fù)制語義,希望禁止復(fù)制類的實(shí)例 //這是一個(gè)很經(jīng)典的C++慣用語法,只要私有化拷貝構(gòu)造函數(shù)和拷貝賦值操作函數(shù)即可 //如果程序中有大量這樣的類,重復(fù)寫這樣的代碼是相當(dāng)乏味的,而且代碼出現(xiàn)的次數(shù)越多越容易增加手寫出錯(cuò)的幾率 class?empty_class { public: ????empty_class()?{} ????~empty_class()?{} ????//編譯器默認(rèn)添加拷貝構(gòu)造函數(shù)和拷貝賦值函數(shù) ????empty_class(const?empty_class?&?)?{} ????empty_class?&operator=(const?empty_class?&)?{} protected: private: }; class?noncopy_class { public: ????noncopy_class()?{} ????~noncopy_class()?{} protected: private: ????//私有化拷貝構(gòu)造函數(shù)和拷貝賦值函數(shù),禁止復(fù)制類 ????noncopy_class(const?noncopy_class?&?)?{} ????noncopy_class?&operator=(const?noncopy_class?&)?{} }; //針對(duì)以上情況,boost中的noncopyable為實(shí)現(xiàn)不可拷貝類提供了簡(jiǎn)單清晰的解決方案 //從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,它明確無誤地表達(dá)了類設(shè)計(jì)者的意圖; ????//對(duì)用戶更加友好,而且與其它的boost庫(kù)配合的也好 ????cin.get(); ????return?0; } |
總結(jié)
以上是生活随笔為你收集整理的boost实用工具:创建一个禁止复制的类 noncopyable的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Html----编写
- 下一篇: HEVC视频编码技术