想了一晚上想不出一个完美的 c++ singleton 方案

2018-11-01 01:28:31 +08:00
 innoink

目前能想到的最完善的方案和这个类似:

https://stackoverflow.com/questions/24964769/singletons-curiously-recurring-template-pattern-and-forwarding-constructor-para/24966418#24966418

要求Foo类必须包含一个不带参的构造函数,这样的话,构造完成之后,用到的地方不用再把参数塞进getInstance里。

和这个答主说的一样,问题在于,一般我们想把Foo做成单例时,如果Foo包含带参数的构造函数,意味着我们想直接通过参数构造一个全局唯一的实例。但是根据上一段话,我们也希望它同时包含不带参的构造函数方便后续调用。

但这样一来,这个不带参的构造函数的意义并不在于"构造",实际上我们期望不通过它来构造,就显得很不自然。而且可能一上来误用不带参的 ctor 导致这个单例没构造成功。

我期望的用法是:

  1. Foo包含一个带参构造函数(比如Foo::Foo(int a)),只能通过它来构造;
  2. 如果程序第一次执行的是Foo::getInstance(123),则成功构造,后续应当支持Foo::getInstance()这种简便写法;
  3. 如果程序第一次执行的是Foo::getInstance(),则报错,停止构造

目前想到的在无参的Foo::Foo()中,直接抛异常。这样能满足以上需求,但是却很不优雅,希望Foo类不动,通过修改singleton来实现。

想了一晚上了,没想出好办法。

1922 次点击
所在节点    问与答
3 条回复
innoink
2018-11-01 13:09:33 +08:00
终于想出一个还过的去的方案
agagega
2018-11-01 13:41:09 +08:00
你不分开,还得用异常来处理,多麻烦
innoink
2018-11-02 11:12:38 +08:00
@agagega 额,异常本来也是避免不了的,因为构造函数本身就有可能抛异常

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/503233

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX