C ++如何初始化std :: istream *虽然构造函数受到保护

时间:2013-08-26 12:13:01

标签: c++ stream

我想使用带有stream-members的类。

我的代码看起来像这样:

//! 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);
    }
};

我收到std :: basic_istream构造函数受保护的错误消息:

  

/ usr / include / c ++ / 4.8.1 / istream:在成员函数`void FilterChain :: init()'中:   /usr/include/c++/4.8.1/istream:606:7:错误:`std :: basic_istream< _CharT,_Traits> :: basic_istream()[with _CharT = char; _Traits = std :: char_traits]'受保护

我也尝试过引用流,但这导致了同样的错误。任何想法如何解决这个问题?

编辑1:

请问我使用新的init()修复它:

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

1 个答案:

答案 0 :(得分:4)

显示的代码实际上根本不包含问题。

问题是你试图在某处默认构造一个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++

更新正如Dietmar刚刚确认的那样,您可以为nullptr参数传递streambuf*

std::istream  m_stream(nullptr);