我会使用像这样的单身人士:
Singleton* single = Singleton::instance(); single->do_it();
我会使用这样一个未命名的类:
single.do_it();
我觉得Singleton模式除了具有可读错误消息之外没有优于未命名类的优势.使用单例比使用未命名的类对象更笨拙:首先,客户端必须首先获得实例的句柄; 第二,Singleton::instance()
可能需要考虑并发的实现者.
那么为什么以及如何选择一个单身人士而不是一个未命名的班级呢?
作为附录,虽然明确定义了一个未命名的类可能是
class { // ... }single;
我可以这样定义它:
#ifndef NDEBUG class Singleton__ { // readable error messages, #else class { // unnamed, clients can't instantiate #endif // ... }single;
后一种方法具有可读编译器错误消息的优点,但在调试模式下不是单例.
我认为最重要的原因是你不能在命名空间范围内放入一个未命名的类.因此,以下内容无效(gcc接受,但警告.在严格模式下,comeau不接受):
class { } single; int main() { }
该类型的single
有没有联系,因为没有办法在另一个范围指的是它(恰恰是因为它没有名字)宣布它的名字.但是使用它来声明single
,其中有链接(在这里是外部的)是无效的(3.5/8).single
必须在主要的本地定义,它将没有链接.您也无法将单个模板传递给函数模板,也不能拥有静态数据成员(因为无法定义它们).所有这些限制使其或多或少不适用于替代单身人士.