我最近遇到了Nifty Counter Idiom.我的理解是,这用于在标准库中实现全局变量,如cout,cerr等.由于专家选择了它,我认为它是一种非常强大的技术.
我试图了解使用更像Meyer Singleton的东西的优势.
例如,人们可以在头文件中:
inline Stream& getStream() { static Stream s; return s; }
static Stream& stream = getStream();
Run Code Online (Sandbox Code Playgroud)
优点是您不必担心引用计数,放置新的,或者有两个类,即代码更简单.既然没有这样做,我肯定有一个原因:
编辑:在阅读Yakk的答案时,我被提示编写以下代码,我将其作为快速演示添加到原始问题中.这是一个非常小的例子,展示了如何使用Meyer Singleton +全局引用在main之前进行初始化:http://coliru.stacked-crooked.com/a/a7f0c8f33ba42b7f.
以下小例子实现了我多次见过的单例模式:
#include <iostream>
class SingletonTest {
private:
SingletonTest() {}
static SingletonTest *instance;
~SingletonTest() {
std::cout << "Destructing!!" << std::endl;
}
public:
static SingletonTest *get_instance() {
if(!instance) instance = new SingletonTest;
return instance;
}
};
SingletonTest *SingletonTest::instance = 0;
int main(int argc, char *argv[]) {
SingletonTest *s = SingletonTest::get_instance();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我遇到的主要问题是我的单身人士的析构函数从未被调用过.
我可以改为instance(c ++ 0x?)shared_ptr,这很好用 - 除了它意味着我的析构函数必须公开.
我可以添加一个静态的'清理'方法,但这会打开用户错误的可能性(即忘记调用它).面对(未处理的)例外,它也不允许适当的清理.
是否存在允许延迟实例化的常见策略/模式,"自动"调用我的析构函数,并且仍然允许我将析构函数保密?