C++ 使用类成员初始化父类
我有一个基本的iostream派生类,如下所示:C++ 使用类成员初始化父类,c++,C++,我有一个基本的iostream派生类,如下所示: class MyStream : public std::basic_iostream< char >, private boost::noncopyable { public: explicit MyStream( SomeUsefulData& data ) : buffer_( data ), std::basic_iostream< c
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更改为heap allocate the 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无论初始化语句的顺序如何,直接基类总是先初始化。 如果您打开更多编译器警告,您应该会得到一个关于此的警告 这意味着是的,用成员初始化基类是错误的,对不起 是的,这是错误的 初始化的顺序是: 基类对象(如果存在) 成员数据对象 构造函数函数代码 因此:
explicit MyStream( SomeUsefulData& data ) :
buffer_( data ),
std::basic_iostream< char >( &buffer_ )
实际上意味着:
explicit MyStream( SomeUsefulData& data ) :
std::basic_iostream< char >( &buffer_ ),
buffer_( data )
这是不对的
请记住,首先构造基类
然后是派生类
这里
您尝试使用尚未构造的缓冲区来初始化基类
explicit MyStream( SomeUsefulData& data ) :
...
std::basic_iostream< char >( &buffer_ )
{
};