有時候,我們需要定義一些獨一無二的類,這些類是如此的特別,以至於我們不能將 其拷貝或者賦值:
1 class Family {};
2
3 Family mine;
4 Family your;
5 Family her(mine);//不能通過編譯
6 mine = your; //也不能通過
可是上一個專題講到,即使我們不定義copy構造函數和copy assignment函數,編譯器 還是會自動定義它們,所以,為了阻止上述行為,我們一般的解決方法就是:
1 class Family
2 {
3 public:
4
5 private:
6 Family(const Family&); //我們將其定義在private中
7 Family& operator=(const Family&); //並且故意不實現它們:)
8 }
這樣,如果用戶無意中調用它們,就會在編譯期間得到錯誤。而如果你在member函數 和friend函數中調用,則會是連接器發出抱怨;
也可以將連接期間的問題移到編譯期間,可以這麼做:
1 class Uncopyable
2 {
3 protected:
4 Uncopyable() {};
5 ~Uncopyable() {};
6 private:
7 Uncopyable(const Uncopyable&); //阻止copy
8 Uncopyable& operator=(const Uncopyalbe&); //阻止
9 };
10
11 class Family: private Uncopyable //繼承以後就完成了
12 {
13
14 };