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

How to init a reference to a class that is declared in a separate file?

本文关键字:声明 引用 文件 单独 初始化      更新时间:2023-10-16
class Foo{
    void operator=(const Foo&){};   
public:
    Foo(){};
};
Foo& fooRef(){
    static Foo aFoo;
    return aFoo;
}
int main() {
    Foo &foo = fooRef();
    return 0;
}

此代码正常工作,不会发出任何错误。一旦我将主的主体更改为:

int main(){
    Foo &foo; 
    foo = fooRef();
    return 0;
}

编译器尝试使用该operator=,因此抱怨。所以我的第一个问题是:为什么它会有所作为?

得出这个事实的方式是,我正在使用CPPunit进行单元测试,我必须测试一个具有getInstance()签名的单例类Singleton& getInstance()。为了进行测试,我正在尝试在TestSingleton类中初始化单例实例。因此具有:

class TestSingleton{
...
private:
    Singleton &instance;
};

void TestSingleton::setUp(){
    this->instance = Singleton::getInstance();
}

具有上述示例会发出错误(因为operator=被声明为私有的,如果不是,很明显我不会调用它)。所以第二个问题是:我如何避免这种情况并在我的TestSingleton类中获得单例实例?

引用既不能默认初始化也不能重新设置。它们必须从一开始就引用现有对象。它们只是另一个对象的别名。

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

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

class TestSingleton{
...
  TestSingleton(Singleton& s) : instance(s) {}
private:
    Singleton &instance;
};

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