我正在尝试使用一些预定义的方法声明来实现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模式。 (如果可以的话,我会改变内部结构,但这是给定代码的某种功课。)
答案 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();