initialize enclosed brace c++ reference initialization-list

enclosed - initialize vector c++ 11



Inicializando una referencia al miembro a NULL en C++ (5)

No puedes "resolver" esto. Use un puntero si desea que ese miembro no apunte a nada.

Las referencias deben inicializarse en un objeto real, no pueden "señalar a ninguna parte".

¿Es posible inicializar un miembro de referencia a NULL en c ++?
Estoy intentando algo así:

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

Sé que puedo hacer esto si inicializo "ReadOnly" a una referencia real de un objeto, pero cuando quiero poner "NULL" allí, obtengo el error:

"no se puede convertir de ''int'' a ''const Object &''

¿Como puedo resolver esto?


Se puede hacer, pero es casi seguro que es una idea extremadamente mala . La forma de hacerlo es eliminar la referencia de un puntero NULL adecuadamente tipado que ya muestra que es una mala idea: se llega a un comportamiento indefinido en este punto que, sin embargo, tiende a "funcionar".

En C ++, las referencias pretenden referirse siempre a un objeto real. Esto es diferente a otros lenguajes de programación donde las "referencias" son en realidad el equivalente de punteros en C ++ (normalmente sin cosas como la aritmética del puntero). Lo que probablemente realmente quieras (desafortunadamente no dijiste lo que intentas lograr pero te preguntaron sobre una solución a un problema que probablemente sea parte de un enfoque equivocado) es usar un puntero en su lugar:

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


Use un puntero: - const Object * pReadOnly;


Es útil para escribir pruebas unitarias. Ese es el único lugar donde debería hacerse, pero allí, es bastante útil.

Bar& bar(*static_cast<Bar*>(0)); MockClass mock; // derives from RealClass mock.foo(bar);

Aquí, estoy probando el código que usa MockClass , no MockClass .

No es una panacea, pero puede ayudar. Además, GoogleMock podría ser tu amigo si te estás burlando de las clases "concretas".

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


No, las referencias no pueden ser NULL en C ++. 1

Las posibles soluciones incluyen:

  • usando un puntero en lugar de una referencia.
  • tener una instancia de Object ficticio que se puede usar para indicar "ningún objeto".

[1] Del estándar C ++ 11 :

[dcl.ref] [...] una referencia nula no puede existir en un programa bien definido, porque la única forma de crear dicha referencia sería vincularla al "objeto" obtenido al desreferenciar un puntero nulo, que causa comportamiento indefinido