Ale*_*sie 0 c++ singleton cppunit
class Foo{
void operator=(const Foo&){};
public:
Foo(){};
};
Foo& fooRef(){
static Foo aFoo;
return aFoo;
}
int main() {
Foo &foo = fooRef();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此代码正常工作,不会发出任何错误.一旦我将主体改为:
int main(){
Foo &foo;
foo = fooRef();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译器尝试使用operator=并因此抱怨.所以我的第一个问题是:它为什么会有所作为?
我来到这个事实的方式是我在做单元测试使用CPPunit,我一定要考有签名一个单独的类getInstance()是Singleton& getInstance().为了进行测试,我试图在TestSingleton类中单例初始化一个实例.因此有:
class TestSingleton{
...
private:
Singleton &instance;
};
void TestSingleton::setUp(){
this->instance = Singleton::getInstance();
}
Run Code Online (Sandbox Code Playgroud)
以上示例发出错误(因为operator=声明为私有,如果不是,则很明显我不会被调用).所以第二个问题是:我如何避免这种情况并在我的TestSingleton班级中获得单身实例?
参考既不能默认初始化也不能重新定位.他们必须从一开始就引用一个现有的对象.它们只是另一个对象的别名.
所以第二个问题是:我如何避免这种情况并在我的
TestSingleton班级中获得单身实例?
您可以使用构造函数初始化列表初始化引用成员:
class TestSingleton{
...
TestSingleton(Singleton& s) : instance(s) {}
private:
Singleton &instance;
};
Run Code Online (Sandbox Code Playgroud)
如果您发现需要能够默认初始化然后重新定位"引用",则应使用指针或可选类型(boost::optional例如,参见参考资料).但在这种特殊情况下,由于您正在处理单例,因此实际上不需要存储对它的引用.您可以Singleton::getInstance()随时随地使用它.