我会使用这样的单例:
Singleton* single = Singleton::instance();
single->do_it();
我会使用这样的未命名类:
single.do_it();
我觉得单例模式除了具有可读的错误消息之外,与未命名的类相比没有任何优势。使用单例比使用未命名的类对象更笨拙:首先,客户端必须首先获取实例的句柄;二、实施者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
has no链接,因为无法在引用它的另一个作用域中声明它的名称(正是因为它没有名称)。但用它来声明single
, which has链接(此处为外部)无效 (3.5/8)。single
必须在 main 中本地定义,在那里它将没有链接。您也不能将 single 传递给函数模板,并且它不能具有静态数据成员(因为无法定义它们)。所有这些限制使它或多或少不适合作为单例的替代品。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)