编辑:为代码添加了更多解释。
使用模板的解决方案如下:
我为类创建了一个模板,这些类在创建时应该具有一个具有全局访问权限的实例。我想这就是你想要的。(我已将其命名为 Singleton 引用具有名称的设计模式).h:
// C++ header for template Singleton
template<typename T>
class Singleton : public T {
static Singleton<T>* instance;
Singleton();
public:
static Singleton<T>* getInstance();
};
getInstance() 方法将来自您将获得该实例的位置。它可以是一个对象而不是一个指针,但我更喜欢这种方式,因为它更通用,你想做一些更复杂的事情,比如在运行时更改实例;它还允许仅在使用对象时实例化对象,从而防止不需要内存分配。.cpp:
// C++ source for template Singleton
template<typename T>
Singleton<T>* Singleton<T>::instance = NULL;
template<typename T>
Singleton<T>::Singleton()
: T()
{}
template<typename T>
Singleton<T>* Singleton<T>::getInstance()
{
if (instance == NULL)
{
instance = new Singleton<T>();
}
return instance;
}
您可以正常实现任何您想要的类,并使用 Singleton 模板来确保您将始终处理某个类的相同全局实例。如果需要,您还可以使用 typedef 来命名类型名称。你的类定义:
// Definition of class foobar
class foobar_impl {
public:
int a;
};
typedef Singleton<foobar_impl> Foobar;
然后,您使用模板重新获取 foobar_impl 的实例:
int main(int argc, char** argv)
{
Foobar *pf = Foobar::getInstance();
return 0;
}
然而,这个解决方案的问题是 Singleton 模板只适用于具有空构造函数的类。但是你的例子也是如此,所以我认为这就是你想要的。