2010-12-06 132 views
0

我想從函數返回一個類的實現。該函數在庫中。我想阻止用戶銷燬我返回的對象。我怎樣才能做到這一點?如何防止用戶破壞對象

編輯:例子。

接口世界:

class Base 
{ 
    public: 
     virtual void foo() = 0; 
}; 

Base* GetFoo(); 

實現 - 內部:

class Bar : public Base 
{ 
    public: 
     void foo() { //Do something} 
}; 

Base* GetFoo() 
{ 
    return new Bar 
} 
+0

有點超出了原始問題的範圍,但我不確定爲什麼使用單獨的函數來獲取接口基礎(實例欄)。你爲什麼不使用工廠方法。 – 2010-12-06 06:21:58

+1

只要用戶試圖將計算機編程爲爆炸顯示器即可。 – 2010-12-06 06:34:01

+0

我相信你想Bar()的構造函數也是私有的? – Jaywalker 2010-12-06 06:46:08

回答

0

你爲什麼要這麼做?無論如何,用戶應該得到返回對象的副本,並且應該由他們決定是否分配或取消分配副本。

0

你不能阻止你的庫的用戶拍攝自己的腳,而清洗了膛的槍。即即使你返回一個常量引用,你也可以從中獲取地址,然後delete它。所以即使在這種情況下你也應該讓你的代碼保持穩定。

P.S.私有析構函數(@ nc3b)會對該類的進一步用法施加限制(例如,不再有本地非動態實例),所以請慎重考慮它們。

0

如果你是return ing是一個new對象,那麼沒有理由爲什麼你需要防止用戶從它delete

但是,您不應該對刪除責任留下任何問題。相反,要麼使用智能指針來返回值,要麼使用多態pImpl模式(其中非多態包裝器包含智能指針指向多態實現 - 通常是提供值語義的智能指針,如this),而不僅僅是返回派生實例。

2

並回答你的問題,因爲你是從基地派生,所以你不能讓基礎析構函數私人。你可以通過受保護的析構函數來實現你的目標。

1

返回一個shared_ptr<Base>並自己保留指針的副本。無論用戶如何使用他的shared_ptr<Base>,該指針都會使對象保持活動狀態。您甚至可以考慮返回weak_ptr<Base>,以強調對象的生命週期僅受您的喜好影響。