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

Initializing a reference to member to NULL in C++

本文关键字:引用 初始化 NULL 成员 C++      更新时间:2023-10-16

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

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

我知道如果我初始化";只读";指向一个对象的真实引用,但当我想放在那里时;如果为"NULL";,我得到错误:

"无法从"int"转换为"const Object&"

我该如何解决这个问题?

否,引用不能是C++中的NULL1

可能的解决方案包括:

  • 使用指针而不是引用
  • 具有可用于指示"无对象"的伪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;