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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top