2010-06-21 42 views

回答

11

您可以將這些函數聲明爲私有的,以防止人們在使用類時使用它們,同時阻止編譯器生成它們。

+0

請注意,這不會阻止這些函數的*聲明,因爲您剛剛自己聲明瞭它們,編譯器在適當的時候可能仍會考慮它們。 – 2013-06-21 15:31:23

2

定義?嗯,是。它們總是宣稱爲(明確由你自己或由編譯器默認),但它們只是由編譯器定義的當/如果你真的使用它們。不要使用它們 - 編譯器不會定義它們。當然,如果通過「阻止編譯器定義......」,你的意思是「阻止編譯器從成功地定義 ...」,即如果你想在編譯時使隱式定義嘗試失敗,那麼您可以通過向類中添加非複製可構建和/或不可分配的子對象(例如,使用私有複製構造函數和專用賦值運算符的基礎或成員)來實現此目的。

+0

@Matthieu M .:首先,什麼是「不一定」? 'const'成員是一個不可分配的子對象。其次,你所說的不完全正確。複製分配*總是被聲明爲*。正如我在我的回答中所說的那樣,在「const」成員的情況下,將會失敗的* definition *嘗試。 – AnT 2010-06-21 08:03:17

6

是的。從boost :: noncopyable派生。 (也有NIH的方法,通過聲明operator =和private構造函數的私有的未定義方法,但是,請喜歡boost)。

3

自己聲明這些函數並將它們設爲私有。你也可以不寫這個函數的定義,所以每個試圖使用這些函數的人都會得到一個鏈接器錯誤。

1

繼承自私人範圍內聲明這些函數的類型,例如boost :: noncopyable。

還是......有一個參考成員變量:P

0

FWIW如果你避開使用Qt,那麼你可以使用Q_DISABLE_COPY宏:

class Foo 
{ 
public: 
    Foo(); 

private: 
    Q_DISABLE_COPY(Foo) 
}; 
3

在C++ 0x中,你馬上就能寫出

class NonCopyable { 
    NonCopyable & operator=(NonCopyable const&) = delete; 
    NonCopyable(NonCopyable const&) = delete; 
}; 

注意,編譯器將不會產生任何情況下轉換NonCopyable::operator=(Other const&)重載。

+0

這樣你就會得到更好的錯誤信息,至少在我看來。 – 2010-06-21 13:26:57