单身和经典构造函数

时间:2012-03-05 08:48:07

标签: c++

这个问题相当基础。我对我的cygwin做了一个简单而直接的测试:

 class Example {
    public:
      Example(){ cout<<"dude..."<<endl; }
      ~Example(){ cout<<"see ya"<<endl; }
    public:
      static Example *GetInstance(){
        if(m_instance==NULL){
          m_instance = new Example();
          cout<<"watch out bro"<<endl;
        }
        return m_instance;
      }
    public:
       void exp(){cout<<"greetings"<<endl;}
    private:
       static Example *m_instance;
 };
 int main(){
   Example a;
   return 0;
  } 

显然,输出是:

 dude...
 greetings
 see ya

技术上单身和典型的构造函数在c ++编程中几乎是不同的故事,因为singleton将构造函数设置为私有,而典型的方式则相反。在我最近的实习经历中,我注意到大多数编码人员都以这种方式实现API。

我只是想知道当两种类构造方法并行存在时是否是这种情况。

更新

是构造函数&amp;在一个程序中存在的单例实际上是无意义的,在这个范围内单独的东西会成为无用的代码,如无害的垃圾?

概要 的 这是一个相当无稽之谈的问题...... 更重要的是,多亏了你们所有人的光彩 构造函数和单例设计模式是“互斥的”,就脆弱性而言,它与全局变量杀死我们的调试时间是一样的...

6 个答案:

答案 0 :(得分:2)

通过将Example的构造函数设为public,可以允许类的用户直接创建实例。如果您的设计只需要一个单例实例,则允许用户无意中破坏此要求。如果您将构造函数设为私有,那么调用GetInstance()将是创建Example对象的唯一方法,从而强制要求只允许创建一个实例。

请注意,静态对象的破坏顺序与创建它们的顺序相反。如果对象相互引用,则会导致问题。这是人们维护代码的陷阱,如果你有多个这样的对象,这很快就会变得无法管理。

许多开发人员认为单身人士与全局变量非常相似:

https://sites.google.com/site/steveyegge2/singleton-considered-stupid

答案 1 :(得分:1)

当使用Singleton设计模式时,你总是应该构造构造函数(复制构造函数)和operator = as private,以确保只有给定类的一个实例。否则,Singleton模式就没有多大意义了。

答案 2 :(得分:0)

我认为你错过了单身人士的整个概念。 Singleton意味着只有一个实例,但公共构造函数可以构造很多对象。

答案 3 :(得分:0)

我认为这个例子已被打破。它允许用户创建多个“单身人士”,然后显然他们不是单身人士。

在单例构造函数中必须是私有的。

答案 4 :(得分:0)

将构造函数设为私有不会使类成为Singleton。为此,在调用构造函数之前,必须确保内存中没有其他实例。即使构造函数是私有的,也可以从静态类成员创建任何数量的类实例

答案 5 :(得分:0)

Singleton是一种确保创建的类只有一个实例的技术。通过暴露公共构造函数,您显然为多个实例打开了大门,因此您的类可能不会被称为单例。

然而,它仍然有一个静态的GetInstance()方法,它在某种程度上被期望作为单例接口,并且这使得谁没有编写代码(甚至以后的某个时候甚至是作者)的混淆。