23

是否可以在 C++ 中将引用成员初始化为 NULL?
我正在尝试这样的事情:

class BigClass
{
private:
  Object m_inner;
public:
  const Object& ReadOnly;
  BigClass() : ReadOnly(NULL)
  {
    Do stuff.
  }
};

我知道如果我将“ReadOnly”初始化为对象的真实引用,我可以做到这一点,但是当我想在那里输入“NULL”时,我得到了错误:

“无法从 'int' 转换为 'const Object &'

我该如何解决这个问题?

4

5 回答 5

37

不,引用不能NULL在 C++ 中。1

可能的解决方案包括:

  • 使用指针而不是引用。
  • 具有Object可用于指示“无对象”的虚拟实例。

[1] 来自C++11 标准

[dcl.ref] [...] 在定义良好的程序中不能存在空引用,因为创建此类引用的唯一方法是将其绑定到通过取消引用空指针获得的“对象”,这会导致未定义的行为。

于 2012-01-29T18:58:34.703 回答
10

你不能“解决”这个问题。如果您希望该成员不指向任何内容,请使用指针。

引用必须初始化为真实对象,它们不能“无处指向”。

于 2012-01-29T18:58:50.433 回答
9

它可以做到,但几乎可以肯定这是一个非常糟糕的主意。这样做的方法是取消引用一个适当类型的NULL指针,这已经表明这是一个坏主意:此时您会遇到未定义的行为,但是通常倾向于“工作”。

在 C++ 中,引用总是指一个实际的对象。这与其他编程语言不同,其中“引用”实际上等同于 C++ 中的指针(通常没有指针算术之类的东西)。您可能真正想要的(不幸的是,您没有说出您尝试实现的目标,而是询问了可能是被误导的方法的一部分的问题的解决方案)是使用指针来代替:

Object const* const readOnly;
BigClass(): readOnly(0) {}
于 2012-01-29T19:03:33.283 回答
3

它在编写单元测试时很有用。这是唯一应该做的地方,但在那里,它非常有帮助。

 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&));
};
于 2012-10-26T01:01:48.013 回答
2

使用指针:- const Object* pReadOnly;

于 2012-01-29T19:00:13.130 回答