有沒有一種方法可以防止編譯器定義拷貝構造函數,對C++類運算符=重載。防止編譯器爲C++類定義拷貝構造函數和運算符=重載
回答
您可以將這些函數聲明爲私有的,以防止人們在使用類時使用它們,同時阻止編譯器生成它們。
定義?嗯,是。它們總是宣稱爲(明確由你自己或由編譯器默認),但它們只是由編譯器定義的當/如果你真的使用它們。不要使用它們 - 編譯器不會定義它們。當然,如果通過「阻止編譯器定義......」,你的意思是「阻止編譯器從成功地定義 ...」,即如果你想在編譯時使隱式定義嘗試失敗,那麼您可以通過向類中添加非複製可構建和/或不可分配的子對象(例如,使用私有複製構造函數和專用賦值運算符的基礎或成員)來實現此目的。
@Matthieu M .:首先,什麼是「不一定」? 'const'成員是一個不可分配的子對象。其次,你所說的不完全正確。複製分配*總是被聲明爲*。正如我在我的回答中所說的那樣,在「const」成員的情況下,將會失敗的* definition *嘗試。 – AnT 2010-06-21 08:03:17
是的。從boost :: noncopyable派生。 (也有NIH的方法,通過聲明operator =和private構造函數的私有的未定義方法,但是,請喜歡boost)。
自己聲明這些函數並將它們設爲私有。你也可以不寫這個函數的定義,所以每個試圖使用這些函數的人都會得到一個鏈接器錯誤。
繼承自私人範圍內聲明這些函數的類型,例如boost :: noncopyable。
還是......有一個參考成員變量:P
FWIW如果你避開使用Qt,那麼你可以使用Q_DISABLE_COPY
宏:
class Foo
{
public:
Foo();
private:
Q_DISABLE_COPY(Foo)
};
在C++ 0x中,你馬上就能寫出
class NonCopyable {
NonCopyable & operator=(NonCopyable const&) = delete;
NonCopyable(NonCopyable const&) = delete;
};
注意,編譯器將不會產生任何情況下轉換NonCopyable::operator=(Other const&)
重載。
這樣你就會得到更好的錯誤信息,至少在我看來。 – 2010-06-21 13:26:57
- 1. 拷貝構造函數和運算符重載:C++
- 2. 拷貝構造函數和assignemnt運算符重載在C++
- 3. C++編譯器如何合成默認拷貝構造函數
- 4. C++編程拷貝構造函數
- 5. 禁止在繼承類中定義拷貝構造函數
- 6. 隱式拷貝構造函數/賦值運算符的行爲
- 7. 拷貝構造函數和賦值運算符執行選擇 -
- 8. 拷貝構造函數和賦值運算符
- 9. 基類的拷貝構造函數(C++)
- 10. 拷貝構造函數類C++
- 11. c#拷貝構造函數生成器
- 12. 拷貝構造函數和operator =在C++
- 13. 指針和拷貝構造函數C++
- 14. C++中的隱式定義的拷貝構造函數是否也爲成員調用拷貝構造函數?
- 15. 爲什麼在函數中本地定義的結構需要賦值運算符和拷貝構造函數
- 16. 爲什麼隱式拷貝構造函數調用基類拷貝構造函數並且定義的拷貝構造函數沒有?
- 17. 拷貝構造函數和函數從
- 18. C++拷貝構造函數/賦值運算錯誤
- 19. 拷貝構造函數/賦值運算符
- 20. 何種條件下,編譯器不會定義implicits(構造函數,析構函數,拷貝構造函數,拷貝賦值)
- 21. 這是爲什麼發生?運算符=和拷貝構造函數
- 22. 拷貝構造函數
- 23. 拷貝構造函數knowlege
- 24. 拷貝構造函數++
- 25. 的拷貝構造函數
- 26. 在C++中重載一個拷貝構造函數
- 27. C++幫助拷貝構造函數
- 28. C++中拷貝構造函數
- 29. 拷貝構造函數在C++
- 30. 通用C#拷貝構造函數
請注意,這不會阻止這些函數的*聲明,因爲您剛剛自己聲明瞭它們,編譯器在適當的時候可能仍會考慮它們。 – 2013-06-21 15:31:23