2011-12-02 52 views
4

在我的GUI應用程序(MFC)中,我正在使用dll在屏幕上顯示某些內容。我有一個靜態庫,它有一個單例類。 例如:sing.lib。我包括應用程序(EXE)項目中的sing.lib和dll項目(因爲都使用這個單例類)單個類實例不同於GUI exe和dll

問題是進入EXE和DLL中的實例是不同的。兩者都調用構造函數! 請參閱單例類代碼片段。

class A 
{ 
private: 
    A(); 
    virtual ~A(); 
    static A* m_pInstance; 
public: 
    static A* GetInstance() 
    { 
     if (NULL == m_pInstance) 
     { 
      m_pInstance = new A(); 
     } 
     return m_pInstance; 
    } 
} 
+2

[稍微OT]我感到震驚的答案沒有提到Singleton是一種反模式,考慮到我在這裏看到的所有Singleton抨擊... –

回答

5

如果您希望在DLL和EXE之間共享單例實例,請將其定義放置在動態鏈接庫而不是靜態庫中。

一般情況下,如果你想要一些數據是全局和唯一的,你不應該把它放在靜態庫中。

考慮

//static lib 

int CurrentCounter =0; 

int getNextCounter() 
{ 
    return CurrentCounter; 
} 

例如在靜態庫中的代碼。在你的情況下,如果這個庫的exe和dll鏈接都將獲得它自己的CurrentCounter。所以exe和dll可以同時具有不同的值CurrentCounter

2

靜態庫鏈接到EXE和DLL中,所以這兩個二進制文件都有你的類的「副本」,所以不同的單例是按設計行爲的。這種單身人士是「每個二進制」而不是每個進程。

您需要一個動態庫來處理真實的進程單元,以便您的EXE使用DLL導出並處理鏈接到DLL中的類。

1

與靜態庫鏈接的每個二進制文件都有其自己的類副本。