当前位置:  开发笔记 > 编程语言 > 正文

你如何在单身人士和未命名的阶级之间做出选择?

如何解决《你如何在单身人士和未命名的阶级之间做出选择?》经验,为你挑选了1个好方法。

我会使用像这样的单身人士:

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;

后一种方法具有可读编译器错误消息的优点,但在调试模式下不是单例.



1> Johannes Sch..:

我认为最重要的原因是你不能在命名空间范围内放入一个未命名的类.因此,以下内容无效(gcc接受,但警告.在严格模式下,comeau不接受):

class { } single;
int main() { }

该类型的single没有联系,因为没有办法在另一个范围指的是它(恰恰是因为它没有名字)宣布它的名字.但是使用它来声明single,其中链接(在这里是外部的)是无效的(3.5/8).single必须在主要的本地定义,它将没有链接.您也无法将单个模板传递给函数模板,也不能拥有静态数据成员(因为无法定义它们).所有这些限制使其或多或少不适用于替代单身人士.

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有