将const引用返回到singleton

时间:2014-05-14 14:04:13

标签: c++ reference singleton

我正在尝试使用一些预定义的方法声明来实现Singleton模式。我认为它有效,但是获得第二个实例会产生另一个实例。

我无法更改方法声明或成员变量。我已经建立了一个小例子:

#include <iostream>
#include <vector>

using namespace std;

class Singleton
{
  private:
    Singleton() {};

    vector<string> data;
    static Singleton *instance;

  public:
    static const Singleton &getInstance()
    {
      if(0 == instance) {
        instance = new Singleton;
      }
      return *instance;
    }

    void push(string &new_element)
    {
      data.push_back(new_element);
    }

    void print()
    {
      for(vector<string>::iterator it = data.begin(); it != data.end(); ++it) {
        cout << *it << endl;
      }
    }
};

Singleton *Singleton::instance = 0;

int main()
{
  Singleton a = Singleton::getInstance();
  Singleton b = Singleton::getInstance();

  string c1 = "Hello";
  string c2 = "World";

  a.push(c1);
  b.push(c2);

  a.print(); // prints only "hello"
}

我的第二次尝试是将a和b更改为这样的引用:

  Singleton &a = Singleton::getInstance();
  Singleton &b = Singleton::getInstance();

但是这会导致另一个错误:

singleton.cpp:40:45: error: invalid initialization of reference of type ‘Singleton&’ from expression of type ‘const Singleton’
singleton.cpp:41:45: error: invalid initialization of reference of type ‘Singleton&’ from expression of type ‘const Singleton’

为什么会这样?有人可以解释一下,为什么要创建Singleton的新实例?

我确实在网上搜索了答案,但没有人像我一样真正使用过Singleton模式。 (如果可以的话,我会改变内部结构,但这是给定代码的某种功课。)

2 个答案:

答案 0 :(得分:2)

此代码导致复制Singleton实例:

Singleton a = Singleton::getInstance();

将代码更改为

const Singleton& a = Singleton::getInstance();

将解决问题。您应该将Singleton的复制构造函数(和赋值运算符)设置为private,以便在编译时禁止复制和赋值:

private:
    Singleton(const Singleton&);
    Singleton& operator=(const Singleton&);

答案 1 :(得分:0)

他们需要const个引用:

   const Singleton &a = Singleton::getInstance();