Idioma base del miembro en C ++
-
25-10-2019 - |
Pregunta
El siguiente código es de aquí:
#include <streambuf> // for std::streambuf
#include <ostream> // for std::ostream
class fdoutbuf
: public std::streambuf
{
public:
explicit fdoutbuf( int fd );
//...
};
class fdostream
: public std::ostream
{
protected:
fdoutbuf buf;
public:
explicit fdostream( int fd )
: buf( fd ), std::ostream( &buf ) // This is not allowed.
// buf can't be initialized before std::ostream.
{}
//...
};
Realmente no entendí el comentario. Por qué "BUF no se puede inicializar antes de std :: Ostream"? ¿Puedo usar algo de ayuda para comprender esto?
Solución
El orden de inicialización está determinado por el orden de declarar a los miembros de su clase, y las clases hereditarias vienen antes de todo eso. Tome un ejemplo simple que ilustra el problema básico sin referirse a la herencia:
class C
{
int a, b;
public:
C() : b(1), a(b) {} // a is initialized before b!
};
¡El código no hace lo que piensas! A se inicializa primero, luego B se inicializa a uno. Por lo tanto, depende del orden de la declaración, no del orden en la lista de inicialización:
int a, b;
Ahora, la misma idea se aplica a las clases base que se inicializan antes de los miembros de la clase derivada. Para resolver este problema, crea una clase que inherente que contiene el miembro que desea inicializar desde una clase base. Por supuesto, esa clase de ayuda debe venir antes de la que realmente está derivando.
Otros consejos
Debe llamar al constructor de clase base antes de inicializar sus variables de miembro, pero pasa un puntero a BUF (una variable miembro que no está definida en este punto) a este constructor.