让我们假设我有以下架构:
Dodo
libdodo
libdodo
和libponny
;主程序称为Dodo::instance()
Ponny
的libponny
课程。它有Dodo
singleton mainwindow.cpp
#include "shared/dodo/dodo.h"
// ...
Dodo::instance()->setNumber(91);
然后,在此调用之后,创建了Ponny
class(ponny.cpp)
ponny.cpp
#include "shared/dodo/dodo.h"
// ...
bool is = (Dodo::instance()->number() == 91);
// Will `is` be true?
那么,我可以这样做吗?
答案 0 :(得分:3)
由于单例行为的定义位于其库中,这意味着单例实例将是唯一的,并且它将存在于创建它的编译单元中。
让我们说libdodo
Dodo.cpp
有static Dodo& Dodo::instance()
{
static Dodo dodo;
return dodo;
}
,你有:
Dodo::instance
请注意,本地静态变量在第一次执行到达声明时被初始化,所以在这种情况下第一次调用Dodo::instance()
时,所以很可能你不会遇到任何问题像这样的懒惰初始化单身。
在这里扮演角色的唯一事实是线程安全,因为当更多线程第一次调用{{1}}时可能存在竞争条件。有关更多信息,我建议您阅读:
这个问题:Singleton & Multi-threading
这篇文章:C++ scoped static initialization is not thread-safe, on purpose!
这个问题也可以帮到你:Thread safe lazy construction of a singleton in C++
另请注意,在C ++ 11(§6.7.4)中,静态变量的初始化保证是线程安全的:
如果控件在初始化变量时同时进入声明,则并发执行应等待初始化完成。
这意味着像这样的延迟初始化变得有点防弹;)
答案 1 :(得分:1)
单例实例是全局的。 Globals可以在DLL /共享对象边界之间共享,如果这正是您所要求的。
您还需要了解One Definition Rule,它确保该类只有一个定义,因此该类中的任何静态成员只有一个实例。