Naw*_*waz 1 c++ idioms ostream initialization-list
下面的代码是从这里:
#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.
{}
//...
};
Run Code Online (Sandbox Code Playgroud)
我真的不明白这个评论.为什么"在std :: ostream之前无法初始化buf"?我可以用一些帮助来理解这个吗?
初始化的顺序由声明类成员的顺序决定,继承的类在所有这些之前.举一个简单的例子来说明基本问题而不参考继承:
class C
{
int a, b;
public:
C() : b(1), a(b) {} // a is initialized before b!
};
Run Code Online (Sandbox Code Playgroud)
代码不符合你的想法!首先初始化a,然后将b初始化为1.所以这取决于声明的顺序而不是初始化列表中的顺序:
int a, b;
Run Code Online (Sandbox Code Playgroud)
现在,同样的想法适用于在派生类成员之前初始化的基类.要解决此问题,请创建一个您固有的类,其中包含要从基类初始化的成员.当然,那个辅助类必须在你实际派生的那个之前.