2012-11-21 116 views
1
class TClass 
{ 
    class EmbeddClass 
    { 
     public: 
     .... 

     protected: 
      virtual ~EmbeddClass() {} 

    } 

    boost::scoped_ptr<EmbeddClass> scpEmbeddClass; 
} 

vs2010抱怨上述代碼。我可以通過將~EmbeddClass定義爲公共功能來解決這個問題。錯誤C2248:無法訪問在類中聲明的受保護成員

問題>這個問題的原因是什麼?是否因爲scoped_ptr的析構函數無法訪問受保護的~EmbeddClass?在我看來,shared_ptr沒有這樣的問題。

謝謝

+0

對於'shared_ptr',取決於你如何初始化它。如果你試圖存儲'EmbeddClass'(而不是派生類型),你實際上可能會遇到這個問題。 –

回答

1

問題>這是什麼問題的原因是什麼?是因爲scoped_ptr的析構函數無法訪問protected〜EmbeddClass?

是的,這正是問題所在。

在我看來,shared_ptr沒有這樣的問題。

我只能假設你沒有存儲EmbeddClass對象,而是存儲在shared_ptr中的對象。在這種情況下,共享指針的構造函數將創建一個刪除程序,它將調用派生類型最多的析構函數(如shared_ptr構造函數/ reset()/..所示)。因爲大多數派生類型被shared_ptr銷燬,即使類型提到基類,它也不會調用基類析構函數。

0

是否因爲scoped_ptr的析構函數無法訪問受保護的 〜EmbeddClass?

是的。

在我看來,shared_ptr沒有這樣的問題。

注意,你可以有多個shared_ptr擁有的資源,如果你不初始化或使用計數大於1,它永遠不會需要調用刪除器。但是,scoped_ptr更像是unique_ptr,它具有唯一所有權,並確保它可以刪除指針,即使您未初始化它。

基本上,不擁有資源的shared_ptr不需要訪問受保護的析構函數,而scoped_ptrunique_ptr確實需要訪問。

相關問題