如何初始化对在单独文件中声明的类的引用?

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班级中获得单身实例?

jua*_*nza 5

参考既不能默认初始化也不能重新定位.他们必须从一开始就引用一个现有的对象.它们只是另一个对象的别名.

所以第二个问题是:我如何避免这种情况并在我的TestSingleton班级中获得单身实例?

您可以使用构造函数初始化列表初始化引用成员:

class TestSingleton{
...
  TestSingleton(Singleton& s) : instance(s) {}
private:
    Singleton &instance;
};
Run Code Online (Sandbox Code Playgroud)

如果您发现需要能够默认初始化然后重新定位"引用",则应使用指针或可选类型(boost::optional例如,参见参考资料).但在这种特殊情况下,由于您正在处理单例,因此实际上不需要存储对它的引用.您可以Singleton::getInstance()随时随地使用它.