23

C ++で参照メンバーをNULLに初期化することは可能ですか?
私はこのようなことをしようとしています:

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

「ReadOnly」をオブジェクトの実際の参照に初期化するとこれを実行できることはわかっていますが、「NULL」をそこに入れたい場合は、次のエラーが発生します。

「'int'から'constObject&'に変換できません

どうすればこれを解決できますか?

4

5 に答える 5

37

NULLいいえ、参照をC++にすることはできません。1

考えられる解決策は次のとおりです。

  • 参照の代わりにポインタを使用します。
  • Object「オブジェクトなし」を示すために使用できるダミーインスタンスがあります。

[1] C ++ 11標準から:

[dcl.ref] [...] null参照は、明確に定義されたプログラムに存在できません。そのような参照を作成する唯一の方法は、nullポインターを逆参照することによって取得された「オブジェクト」にバインドすることであり、これにより、未定義の動作。

于 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 に答える