我有一个这样的basic_iostream派生类:
class MyStream : public std::basic_iostream< char >,
private boost::noncopyable
{
public:
explicit MyStream( SomeUsefulData& data ) :
buffer_( data ),
std::basic_iostream< char >( &buffer_ )
{
};
~MyStream()
{
};
private:
/// internal stream buffer
MyStreamBuffer< char > buffer_;
}; // class MyStream
但是,当我创建它的实例时,我得到一个DataAbort异常。
SomeUsefulData data;
MyStream stream( data ); // <- Data Abort
但是,如果我将MyStream更改为堆分配MyStreamBuffer,它可以正常工作:
class MyStream : public std::basic_iostream< char >,
private boost::noncopyable
{
public:
explicit MyStream( SomeUsefulData& data ) :
std::basic_iostream< char >( new MyStreamBuffer< char >( data ) )
{
};
~MyStream()
{
delete rdbuf();
};
}; // class MyStream
使用类成员初始化父类是错误的吗?
谢谢, PaulH
答案 0 :(得分:6)
无论您将初始化语句放入何种顺序,都始终首先初始化直接基类。 如果您打开更多编译器警告,则应该收到有关此警告的警告。
这意味着是的,使用成员初始化基类是不对的,抱歉!
答案 1 :(得分:2)
是的,这是错的。
初始化的顺序是:
所以这个:
explicit MyStream( SomeUsefulData& data ) :
buffer_( data ),
std::basic_iostream< char >( &buffer_ )
实际意味着:
explicit MyStream( SomeUsefulData& data ) :
std::basic_iostream< char >( &buffer_ ),
buffer_( data )
答案 2 :(得分:0)
错了 记得首先构造基类 然后是派生类
这里
explicit MyStream( SomeUsefulData& data ) :
...
std::basic_iostream< char >( &buffer_ )
{
};
您尝试使用尚未构造的buffer_初始化基类