2011-07-07 26 views
7

我發現讓一個不可複製的類可以幫助我提高代碼質量。最初我用boost :: noncopyable做了這個,但我發現VC++編譯器錯誤不如私有成員(雙擊導致代碼中的錯誤位置)有用。C++不可複製除了有時

T(T const&); 
T& operator=(T const&); 

確實,它已經提醒我很多情況下,類沒有作爲參考傳遞給他們應該有的地方。非常如此,即使我只需要複製構造一次的類,我也非常希望得到警告。

有沒有很好的方法來做到這一點?我正在考慮以上兩種私有方法,並添加一個公共T(T const &,bool dummy)構造函數,以便在我真的想複製構造函數時進行調用。或者,也許也可以使上面兩個方法公開,並在複製構造時以某種方式激活編譯器警告,抑制我想要的警告。

或者也許有一個更好的方法嗎?

回答

6

不確定它是否正是你想要的,但是如果你標記拷貝構造函數explicit那麼這個類不能被值或拷貝初始化傳遞,但你可以使用直接初始化來拷貝構造。

你大概會想保留轉讓運營商私人,也許NonAssignable基地將是有用的。

+1

我最喜歡這個答案。根據我的經驗,複製構造函數的問題是當他們被某個巨大對象「偶然」調用時。 「顯式」迫使你在引用它時考慮它,這應該足夠了。 – Nemo

+0

乾杯,這完全適合我的需求。謝謝。 – Cookie

2

我想你自己命名完美的方式。

我只記得一個整潔的小把戲我曾經在另一個代碼的基礎上我打的工作(?):

struct T 
{ 
    friend class SomeClientThatCanConstructT; 
    T(T const&); 

    private: 
    T(T const&);   
}; 

正如在評論中討論以下不會飛

您可以選擇一個明確的名稱(如CopyConstruct)並依賴RVO同等效率:

struct T 
{ 
    inline T CopyConstruct() const  { return *this; } 
    inline T& AssignTo(T& dst) const { return dst = *this; } 
    inline T& AssignFrom(const T& src) { return *this = src; } 

    private: 
    T(T const&); 
    T& operator=(T const&); 
}; 

+0

我想過這個,但是你的'CopyConstruct'要求拷貝構造函數即使編譯器沒有調用它也是可訪問的。 –

+0

Shute。謝謝你提醒我。這確實是一個限制。當然,你可以一直使用它,但對於構​​造函數調用來說,你的'標籤參數'解決方案確實沒有其他選擇。想想看,我突然想起自己在做這個...更新回答 – sehe

+0

那個朋友似乎現在已經開始行動了。 –

0

你可能默認構造T,然後添加一個assign方法來使用。儘管這看起來並不完美,但表明您可能需要檢查複製需求。

0

我不喜歡限制類型的想法(CopyConstructible是stdlib中的一個常用概念),因爲它可能會被濫用。如果你可以從另一個實例構造一個對象,它應該是可複製的。它也會將讀者從重要的代碼中分散出去,而沒有達到任何真正的目的。

在複製構造函數觸發的調試模式下,警告或聲明可能真的是你要找的東西嗎?

+0

有這樣的事嗎?例如我可以在編譯器或鏈接器鏈接到函數時定義用戶定義的警告嗎?然後抑制我想要的對象文件中的警告?像編譯警告禁用? – Cookie

相關問題