2010-07-04 35 views
0

所以我得擁有一個指向實際執行書面級的輸出流類,我需要一個拷貝構造函數,這樣我可以從一個函數返回初始化的實例,這樣我可以透明地結合特定值的用戶。爲了有合理的複製語義,我真的很想清除複製對象中的寫入器指針,並關閉它,使其在複製過程中不可用。複製構造函數中const_cast的含義?

我能做到這一點就好了非常拷貝構造函數,一拉:

class Test { 
    public: 
    Test(Test& other); 
}; 

但我希望能夠直接從臨時通過函數調用返回分配:

Test test = make_test(); 

拷貝構造函數需要爲const。所以我很好奇在複製構造函數中使用const_cast的含義。我會將另一個引用強制轉換爲非const指針,並清除我提到的寫指針。我知道const_cast通常被認爲是邪惡的,但它可以在這種情況下工作嗎?我特別好奇它將如何與函數調用返回的臨時對象進行交互。

或者只有四個創建函數,我真的想訪問複製構造函數,如果有一個合理的方法來限制它,以便它只能用於這些函數(包括它們的返回值),那麼我' d更喜歡這一點。

回答

2

您就違反了你的對象的公共合同的任何客戶端代碼通過使您常拷貝構造函數破壞性的期望。

除此之外,還有以消除參數的常量性沒有問題。

+0

理想情況下,用戶將永遠無法複製這些對象,但情況需要我不這樣做。我打算明確指出,複製對象會使源對象無效,並在用戶嘗試寫入舊對象時通過異常系統非常清楚地通知用戶。我絞盡腦汁地圍繞着如何構建這個正確的方向,但是這個方案需要最少的妥協。感謝保證它在技術上沒有道德上的問題;) – 2010-07-04 03:25:23

1

您不妨看看std::auto_ptr的實施作爲其拷貝構造函數也變異原始對象。

但要注意,這個語義也正是爲什麼很多人不喜歡std::auto_ptr

3

聽起來像是可變作業:

struct A { 

    A() : x(0) {} 

    A(const A & a) : x(a.x) { 
     a.x = 0; 
    } 

    mutable int x; 
}; 

int main() { 
    A a1; 
    A a2 = a1; 
} 
+0

哦,我不知道,即使存在,這可能會很好 – 2010-07-04 14:06:08