我正在重写一些代码以消除全局变量并使类构造函数/析构函数句柄清理某些第三方库资源,但我担心一些代码会从类初始化列表中的另一个成员初始化一个成员。
class MyPodofoDocument {
public:
// generates pdf to stream
MyPodofoDocument(std::stringstream *pStringStream)
: device(pStringStream), document(&device)
{
}
private:
PoDoFo::PdfOutputDevice device;
PoDoFo::PdfStreamedDocument document;
PoDoFo::PdfPainter painter;
};
使用此类的代码不需要查看使用该库的所有细节,但是我隐藏它们的方式使它依赖于使用成员初始化其他成员,然后才能访问构造函数的实际代码块,它有一个有效的指针。
它适用于单元测试骨架,所以我的问题基本上是“这样可以,便携且安全吗?”
答案 0 :(得分:8)
成员按照声明的顺序进行初始化,从上到下
PoDoFo::PdfOutputDevice device;
PoDoFo::PdfStreamedDocument document;
PoDoFo::PdfPainter painter;
因此可以安全地使用device
初始化document
。
答案 1 :(得分:4)
有点儿。规则是成员变量按照它们在类声明中声明的顺序进行初始化。
在您的情况下,由于在device
之前声明了document
,因此很好。
但是,在下列情况下,我们有未定义的行为,尽管初始化列表的顺序。
class A {
public:
A(int i) : b(i), a(b) { }
private:
int a;
int b;
}