如何初始化对在单独文件中声明的类的引用
How to init a reference to a class that is declared in a separate file?
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()
。
相关文章:
- 错误:使用通用引用的声明冲突
- C++(和 ROS) - 包含与前向声明引用,设置默认值和类型定义
- 关于隐式声明的复制构造函数的引用在逻辑上不清楚
- 使用 enable_if 在按值传递与按引用传递之间更改函数声明
- 在C++中,如果成员引用在其声明中初始化,为什么需要存储空间?
- 为什么转发声明的好友类不能在类中引用?
- 如何在方法主体中返回声明向量的引用?
- using声明不能引用类成员
- 是否可以在 using 声明中引用用户定义的转换模板?
- 是否可以在引用另一个派生类的派生类中声明复制构造函数?
- 如果使用返回引用的函数初始化"auto"var,为什么它不声明引用类型?
- C++中未初始化的引用(使用 extern 声明)
- 字符串声明/引用参数(c++)的困难
- 如何声明引用自身的typedef
- 在C++中,我们不能在没有初始化的情况下声明引用。为什么?
- 声明引用适用于类,但不适用于主函数
- 除了类型 &var=var 之外,还有哪些方法可以在C++中声明引用?
- 对派生类的构造函数的未声明引用
- 声明引用的C++开销
- 在循环中声明引用变量