在C++中将对成员的引用初始化为NULL
Initializing a reference to member to NULL in C++
是否可以在c++中将引用成员初始化为NULL
我正在尝试这样的东西:
class BigClass
{
private:
Object m_inner;
public:
const Object& ReadOnly;
BigClass() : ReadOnly(NULL)
{
Do stuff.
}
};
我知道如果我初始化";只读";指向一个对象的真实引用,但当我想放在那里时;如果为"NULL";,我得到错误:
"无法从"int"转换为"const Object&"
我该如何解决这个问题?
否,引用不能是C++中的NULL
1
可能的解决方案包括:
- 使用指针而不是引用
- 具有可用于指示"无对象"的伪CCD_ 2实例
[1]来自C++11标准:
[dcl.ref][…]空引用不能存在于定义良好的程序中,因为创建此类引用的唯一方法是将其绑定到通过取消引用空指针获得的"对象",这会导致未定义的行为
您无法"解决"此问题。如果您希望该成员不指向任何内容,请使用指针。
引用必须初始化为真实对象,它们不能"指向任何地方"。
这是可以做到的,但几乎可以肯定这是一个非常糟糕的想法。这样做的方法是取消引用一个适当类型的NULL
指针,这已经表明这是一个坏主意:在这一点上,你会得到未定义的行为,然而,这通常会"起作用"。
在C++中,引用总是指一个实际的对象。这与其他编程语言不同,在其他编程语言中,"引用"实际上相当于C++中的指针(通常没有指针算术之类的东西)。你可能真正想要的(不幸的是,你没有说出你试图实现的目标,而是询问了一个问题的解决方案,这可能是一种被误导的方法的一部分)是使用指针:
Object const* const readOnly;
BigClass(): readOnly(0) {}
它在编写单元测试时很有用。这是唯一应该做的地方,但在那里,它很有帮助。
Bar& bar(*static_cast<Bar*>(0));
MockClass mock; // derives from RealClass
mock.foo(bar);
在这里,我测试的是使用MockClass
而不是MockClass
本身的代码。
这不是万灵药,但它会有所帮助。此外,如果你在嘲笑"具体"类,GoogleMock可能是你的朋友。
struct Bar;
struct RealClass {
int& x_;
double& y_;
RealClass(int& x, double& y) :x_(x), y_(y) {}
virtual void foo(Bar&);
};
struct MockClass: public RealClass {
MockClass(): RealClass(*(int*)0, *(double*)0) {}
MOCK_METHOD1(foo, void(Bar&));
};
使用指针:-const对象*pReadOnly;
- C++-模板嵌套类的引用初始化无效
- 在引用初始化中使用已删除的复制构造函数进行复制初始化
- 模板流运算符重载错误:引用初始化无效,与basic_istream和basic_ifstream之间的差异有关
- 具有字符串文本构造函数的类不适用于 const 引用初始化
- 类型为"短整型 (&)"的引用初始化无效
- 引用初始化和常量表达式
- 在Visual Studio 2013中为rvalue引用初始化捕获
- 从大括号括起来的初始值设定项列表进行的Lvalue引用初始化无法编译
- Visual C++ 2015 中右值的非常量引用初始化无效
- 是否可以使用对派生类实例的基类引用初始化派生类引用
- 类型'int&'的引用初始化无效,传递参数 1 时出错
- 引用初始化表单
- 从类型为"int*"的临时引用初始化类型为"int&"的非常量引用无效
- 简单的C++日志记录类-ostream引用初始化
- 错误:类型为"cv::Mat&"的非常量引用初始化无效
- 为什么我收到类型为"const vec&"的引用初始化无效
- 从类型为"char*"的临时引用初始化类型为"char*&"的非常量引用
- 为什么这会发送一个关于引用初始化无效的错误
- 为什么此处不对引用初始化执行复制初始化?
- std::vector不会为多个向量条目创建cv::Mat的新引用——初始化矩阵时,数据会被覆盖