Вопрос

Следующий код из здесь:

#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.
        {}
    //...
};

Я не очень понял комментарий. Почему "BUF не может быть инициализирован до STD :: Ostream"? Могу ли я использовать помощь в понимании этого?

Это было полезно?

Решение

Порядок инициализации определяется порядок объявления ваших классов, и унаследованные классы представлены до всего этого. Возьмите простой пример, который иллюстрирует основную проблему, не имея в виду наследование:

class C
{
  int a, b;
public:
  C() : b(1), a(b) {} // a is initialized before b!
};

Код не делает то, что вы думаете! A сначала инициализируется, затем B инициализируется до одного. Таким образом, это зависит от порядка объявления, а не от порядка в списке инициализации:

int a, b;

Теперь та же идея относится к базовым классам, которые инициализируются перед полученными членами класса. Чтобы решить эту проблему, вы создаете класс, который вы присутствуете, который содержит участника, которого вы хотите инициализировать из базового класса. Конечно, этот вспомогательный класс должен быть до того, от которого вы на самом деле получаете.

Другие советы

Вы должны вызвать конструктор базового класса, прежде чем инициализировать переменные своих членов, но вы передаете указатель BUF (переменную члена, которая не определена на данный момент) на этот конструктор.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top