在我的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;
}
}
答案 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)
与静态库链接的每个二进制文件都有自己的类副本。