2013-05-06 40 views
3

我測試了一種模式來聲明C++中的單例類,它使默認的析構函數'私有',但是該模式不通過任何成員調用來使用這個析構函數。爲什麼/清理靜態的機制如何獲得訪問權限以允許其調用私人成員?

我使用gnu g ++ compliler在Ubuntu QQ上測試了這段代碼 - 析構函數在程序終止時被調用,雖然被指定爲'private'。

由於它被指定爲private,因此這個析構函數被調用了誰/什麼/如何?

注意:我來自Delphi/Object Pascal世界,並且沒有ObjectPascal支持的靜態類聲明 - 雖然有幾種方法可以創建單例。根據我的經驗,'私人'('嚴格私人')是PRIVATE。我發現在C++中它並不是那樣。

說明?

+0

可能重複[如何調用靜態對象的私有析構函數?](http://stackoverflow.com/questions/11524131/how-are-the-private-destructors-of-static-objects-called) – 2013-05-06 21:08:55

回答

1

(OP編輯後編輯)

使析構函數私人防止它被顯式調用。

如果析構函數是公開的,這將是合法的:

MyClass.getInstance().~MyClass(); 

靜態存儲對象的析構函數被稱爲從main返回()或調用exit的結果()。

+0

@Mikey - 新的問題在上面回答。 – 2013-05-06 19:16:44

+0

查看新問題標題並編輯... :-)我想我沒有把我的問題弄清楚 – Vector 2013-05-06 20:36:56

+0

您問是否應該公開。第二個問題由http:// stackoverflow解決。com/questions/11524131 /如何調用靜態對象的私有析構函數。 – 2013-05-06 21:08:46

4

該對象通常由static成員函數實例化,該函數稱爲類似getInstance的東西,然後爲您提供對該對象的引用。因爲它是一個成員函數,所以它可以訪問構造函數。

典型的例子:

class S 
{ 
    public: 
     // This is a member function so can access the constructor of S 
     static S& getInstance() 
     { 
      static S instance; 
      return instance; 
     } 
    private: 
     S() {}; 
     S(S const&); 
     void operator=(S const&); 
}; 
+0

明顯 - 我的構造函數中的愚蠢問題 - 請參閱編輯。 – Vector 2013-05-06 19:01:43

1

典型單類具有一個返回指針到singleton對象的靜態成員函數。例如:

Singleton *Singleton::instance(); 

其中instance()是靜態成員函數。靜態成員函數可以調用私有構造函數。

+0

明顯 - 我的構造函數中的愚蠢問題 - 請參閱編輯。 – Vector 2013-05-06 19:02:06

+0

如果我沒有弄錯,程序終止時會調用靜態對象的析構函數。 – 2013-05-06 19:06:53

+0

所以我會想 - 但是什麼叫它呢?如果析構函數是私有的,它不能被任何外部調用。如果默認的析構函數會被調用,那麼聲明它是私有的有什麼意義呢?如果你在析構函數中有清理代碼呢?我認爲這個設計有些不對。 – Vector 2013-05-06 19:13:32

1

它們是私人的,因爲您不希望允許通過任何外部代碼構建或銷燬該對象。單身人士通常有一個靜態實例,通過工廠方法進行初始化和刪除。

tempalte <class T> 
class Singleton 
{ 
public: 
    static T* GetInstance() 
    { 
     if(!m_sInstance) 
     { 
      m_sInstance = new T(); 
     } 

     return m_sInstance; 
    } 

    static void DestroyInstance() 
    { 
     delete m_sInstance; 
     m_sInstance = 0; 
    } 
private: 
    static T* m_sInstance;  
}; 

class Foo : public Singleton<Foo> 
{ 
friend class Singleton<Foo>; 
private: 
    Foo(); 
    ~Foo(); 
}; 

所以,你可以打電話Foo::GetInstance()Foo::DestroyInstance()訪問和刪除單個對象。

相關問題