2012-07-06 35 views
0

在構造函數中將類作爲參數傳遞時,我最終會在大多數情況下傳遞指針。造成這種情況的主要原因是我要傳遞不能被實例化抽象類,並作爲參考不能爲空我真的沒有選擇......將抽象基類作爲成員處理時的所有權問題

下面是一個例子:

// Abstract class A 
class A { 
    virtual void foo() = 0; 
}; 

class B : public A { 
    void foo(); 
}; 

class C { 
public: 
    C(A* a) : _a(a) {}; 
private: 
    A* _a; 
}; 

在某些情況下,我想要C處理A對象_a指向(在刪除時刪除它),在其他情況下,我想要C刪除_a而不刪除A對象。

什麼是具有良好編程方法的最佳實踐?

+0

使用參考文獻 - 表達「僅查看 - 不取得所有權」時,它們確實發光。如果你真的需要一個空值,'boost :: optional '可用。 – 2012-07-06 12:19:13

+0

不幸的是,我無法在抽象類上使用引用。增強功能當然很棒,但現在我無法在工作中使用它。是否有任何純粹的C++功能來解決這個問題? – vanna 2012-07-06 12:27:28

+1

你肯定[可以](http://ideone.com/fVwq7)使用引用。 – 2012-07-06 12:55:56

回答

2

使用shared_ptr表示共享所有權,unique_ptr表示獨特的所有權。如果您確定C的生命週期由A對象(或另一個擁有A的對象)的生存期限定,則可以使用引用或帶有零刪除器的shared_ptr

+1

+1但是,如果您不確定,參考不是​​一個選項。參考意味着班級不負責任,所以你必須確保至少有這麼多。如果你不確定,'shared_ptr'是更好的選擇。 – 2012-07-06 13:13:44