2013-08-26 2 views
3

Я хочу использовать класс с участниками потока.C++ Как инициализировать std :: istream * хотя конструктор защищен

Мой код выглядит следующим образом:

//! pushes a Source and InputFilters into a filtering_istream 
class FilterChain { 
public: 
    //! create an empty FilterChain 
    FilterChain(){ 
     init(); 
    } 

private: 
    //! the stream to connect Source and InputFilters together 
    io::filtering_istream* m_filteringStream; 
    //! stream to use by other classes 
    std::istream* m_stream; 

    void init(){ 
     std::streambuf* streamBuffer = m_filteringStream->rdbuf(); 
     m_stream->rdbuf(streamBuffer); 
    } 
}; 

Я получаю сообщение об ошибке, которое защищено конструктор станд :: basic_istream:

/usr/include/c++/4.8.1/istream: In member function `void FilterChain::init()': /usr/include/c++/4.8.1/istream:606:7: Error: `std::basic_istream<_CharT, _Traits>::basic_istream() [with _CharT = char; _Traits = std::char_traits]' is protected

я попытался ссылки потока, а, но, вызвавшей же ошибка. Любые идеи, как это исправить?

EDIT 1:

Thx к sehe Я установил его с новым Init() вроде этого:

void init(){ 
     std::streambuf* streamBuffer = m_filteringStream->rdbuf(); 
     m_stream = new std::istream(streamBuffer); 
    } 
+2

Pro советы: (а) включать код, который вызывает проблему. (b) переключиться на локаль en_US перед публикацией ошибок компилятора – sehe

+0

Надеюсь, вы выделите эти указатели где-нибудь. –

+3

@JoachimPileborg Компилятор выделяет для вас указатель ... Теперь задача программиста состоит в том, чтобы правильно их инициализировать:/ – sehe

ответ

2

Ваш код, показанный на самом деле не содержит проблему вообще.

Проблема в том, что вы пытаетесь по умолчанию построить объект istream где-нибудь (не в вашем вопросительном коде).

Вы должны по крайней мере буфер для его инициализации с:

std::filebuf m_dummy; 
std::istream m_stream(&dummy); 

Теперь вы можете переназначить rdbuf, как вы делали. См. Также, например. How can I switch between fstream files without closing them (Simultaneous output files) - C++

Update Как Дитмар только что подтвердил, вы можете просто передать nullptr для streambuf* аргумента:

std::istream m_stream(nullptr); 
+0

Thx много! С вашей помощью я исправил его, как в приведенном выше коде. – schindi

Смежные вопросы