单个类实例在GUI exe和dll中是不同的

时间:2011-12-02 12:21:45

标签: c++ windows mfc singleton

在我的GUI应用程序(MFC)中,我使用dll在屏幕上显示某些内容。我有一个静态库,它有一个单例类。 例如:sing.lib。我在应用程序(exe)项目和dll项目中包含sing.lib(coz都使用这个单例类)

问题是进入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;
    }
}

3 个答案:

答案 0 :(得分:5)

如果您希望在dll和exe之间共享单例实例,请将其定义放在动态链接库中,而不是静态库。

通常,如果您希望某些数据是全局且唯一的,则不应将其放在静态库中。

考虑

//static lib

int CurrentCounter =0;

int getNextCounter()
{
    return CurrentCounter;
}

静态库中的这样的代码。在你的情况下,如果exe和dll链接到这个库,每个都将获得自己的 CurrentCounter 。因此exe和dll可以同时具有不同的 CurrentCounter 值。

答案 1 :(得分:2)

静态库链接到EXE和DLL中,因此两个二进制文件都有“你的类的副本”,因此不同的单例是设计行为。这种单身人士是“每个二进制”而不是每个进程。

您需要一个动态库来实现真正的进程范围单例,以便您的EXE将使用DLL导出并处理链接到DLL的类。

答案 2 :(得分:1)

与静态库链接的每个二进制文件都有自己的类副本。