【问题标题】:How can I do some code work just like a singleton? [duplicate]我怎样才能像单例一样做一些代码工作? [复制]
【发布时间】:2011-06-15 10:23:48
【问题描述】:

可能重复:
C++ Singleton design pattern.

如何在不使用单例的情况下只创建一个类的一个实例并与我的所有头文件和源文件共享该实例?能举个简单的例子吗?

【问题讨论】:

  • 呃,这不是单身人士的定义吗?
  • “共享该实例”是什么意思?还有,作业?
  • 我知道这是单例的定义,但我需要知道是否有其他方法可以做到这一点。当我说要共享实例时,我的意思是使用在我的所有源和标头中创建的唯一实例。我也想和例子:)。谢谢
  • 也许“使用单例”意味着在类本身中实现约束。
  • 我不认为它是重复的;他似乎知道辛格尔顿,但他不想要。看起来这并不能解决他的问题;。这就是为什么他要问一个解决方案“不使用单例”

标签: c++


【解决方案1】:

你可以这样做:

class Sample
{
   /*** your code **/
   public:
    Sample();
    void DoWork();
    int  GetValue();
  /*** other functions ***/
};

Sample & OneInstance()
{
    static Sample instance;
    return instance;
}

//Use OneInstance everywhere like this
OneInstance().DoWork();

注意Sample 不是Singleton,但您可以使用OneInstance() 函数,就好像它是Sample 的同一个实例一样,您可以在任何地方使用它!

您可以使用它来初始化一些全局变量,也可以这样:

int g_SomeValue= OneInstance().GetValue();

这不能用Sample 的全局static 实例来完成。那是因为:

static initialization order fiasco

【讨论】:

  • 问题在于该示例允许任何人创建示例实例。
  • @jose:完全正确。这就是不是单身人士的意思。那不是问题。 OP 想要一个他可以在整个程序中使用的实例。他可能想在其他一些上下文或情况下创建多个实例。他可能正面临一个他想要创建这样一个类或这样一个全局实例的情况。我只是想帮助他,因为我不知道他到底面临着什么。也许,他根本不需要它,或者也许他需要它。谁知道。但我能做的,回答他的问题。也许,它会帮助他!
  • 如果我在头文件中的类声明该类的全局实例为 const 并在我的其他源和头文件中使用它怎么办?可以吗??
  • Sample & OneInstance() { static Sample instance;返回实例; } 这将永远是同一个实例???
  • @jose: const 实例无法更改,也许他不想要它。而且我的解决方案不会解决所有问题,没有解决方案可以解决所有问题。我不知道他是否想要const 实例。到目前为止,他还没有这么说。
【解决方案2】:

【讨论】:

    【解决方案3】:

    我建议不要在可以避免的情况下共享任何内容,因为共享会使并发变得困难。如果您不关心并发性,那么您应该将对象作为额外参数传递给函数。全局变量通常是个坏主意,而单身人士通常只是穿着奇装异服的全局变量。

    【讨论】:

      猜你喜欢
      • 2015-05-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-19
      • 1970-01-01
      • 2022-11-09
      相关资源
      最近更新 更多