在C ++中将对成员的引用初始化为NULL

时间:2012-01-29 18:56:09

标签: c++ reference initialization-list

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

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

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

  

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

我该如何解决这个问题?

5 个答案:

答案 0 :(得分:28)

不,C ++中的引用不能是NULL 1

可能的解决方案包括:

  • 使用指针代替引用。
  • 有一个虚拟Object实例,可用于表示“无对象”。

[1]来自C++11 standard

  

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

答案 1 :(得分:10)

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

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

答案 2 :(得分:7)

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

在C ++中,引用意味着始终引用实际对象。这与其他编程语言不同,其中“引用”实际上等同于C ++中的指针(通常没有像指针算术这样的东西)。您可能真正想要的是什么(遗憾的是,您没有说出您尝试实现它的目的但是询问问题的解决方案,这可能是误导方法的一部分)是使用指针代替:

Object const* const readOnly;
BigClass(): readOnly(0) {}

答案 3 :(得分:2)

使用指针: -  const Object * pReadOnly;

答案 4 :(得分: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&));
};