簡體   English   中英

在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.
  }
};

我知道如果將“ ReadOnly”初始化為對象的真實引用,我可以執行此操作,但是當我想在其中放入“ NULL”時,出現錯誤:

“無法從'int'轉換為'const Object&'

我該如何解決?

不可以,在C ++中引用不能為NULL 1個

可能的解決方案包括:

  • 使用指針而不是引用。
  • 具有一個可用於指示“無對象”的虛擬Object實例。

[1]根據C ++ 11標准

[dcl.ref] [...]空引用不能存在於定義良好的程序中,因為創建此類引用的唯一方法是將其綁定到通過解引用空指針而獲得的“對象”,這會導致未定義的行為。

您無法“解決”此問題。 如果希望不讓該成員指向任何東西,請使用指針。

引用必須初始化為真實對象,它們不能“無處指向”。

可以做到,但是幾乎可以肯定,這是一個非常糟糕的主意 做到這一點的方法是取消引用適當類型的NULL指針,這已經表明這是一個壞主意:此時,您會遇到未定義的行為,但是通常會“起作用”。

在C ++中,引用是指始終引用實際對象。 這與其他編程語言不同,在其他編程語言中,“引用”實際上等效於C ++中的指針 (通常不包含指針算術)。 您實際上可能想要的(不幸的是,您沒有說要實現的目標,而是詢問解決問題的方法,這可能是誤導方法的一部分),而是使用指針:

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

使用指針:-const Object * pReadOnly;

在編寫單元測試中很有用。 那是唯一應該做的地方,但是在那兒很有幫助。

 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&));
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM