2014-04-14 47 views

回答

1

用C++ 11繼承,你可以刪除構造函數和析構函數,使許多不可複製/不可移動成語過時:

YourClass() = delete; /*deletion of default constructor*/ 
YourClass(const YourClass&) = delete; /*deletion of copy constructor*/ 
~YourClass() = delete; /*deletion of the destructor of YourClass*/ 

等你如果任何代碼需要這些,將會導致編譯時失敗。

+0

這是首選的方式嗎?對於需要這些功能的每個班級來說,這可能會變得有點乏味。 – NFRCR

+0

如何刪除析構函數? –

+0

單調乏味,但非常清晰,非常便攜。你可以把它包裝在模板特徵/策略類中,但不要混淆。 – Bathsheba

2

沒有不可複製的基礎不需要虛擬析構函數。但是,延伸這種非可複製類的類可能需要虛擬析構函數。

如果您正在使用升壓,你可以從noncopyable.hpp

+0

這更像是一個問題,當我擁有自己的NonCopyable/NonMovable時該怎麼做。我應該提供一個虛擬析構函數,我猜不。 – NFRCR

+0

虛擬析構函數在將對象存儲在基類的指針指向的位置時非常有用。在這裏,除非你使用base(非可複製的參考),否則沒有必要。所以我沒有看到需要。 –

0

性狀NonCopyable和NonMovable彼此正交,並與多態使用。
那麼,爲什麼不應該有人想混合搭配?

無論如何,避免這個問題的正確方法是聲明那些受到保護的類的析構函數,並且只將它們繼承爲私有的。尼爾柯克是對的。另外,從C++ 11開始,您可以顯式聲明任何要刪除的函數,這是首選方法。

相關問題