9

我正在重写一些代码以消除全局变量,并使类构造函数/析构函数处理一些第三方库资源的清理,但我担心一些代码会从类初始化列表中的另一个成员初始化一个成员。

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;
};

使用此类的代码不需要查看使用该库的所有详细信息,但我隐藏它们的方式使其依赖于使用成员来初始化其他成员,然后才能到达构造函数的实际代码块,它在哪里有一个有效的 this 指针。

它在单元测试框架中工作,所以我的问题基本上是,“这可以吗,便携且安全吗?”

4

2 回答 2

8

成员按照声明的顺序从上到下进行初始化

PoDoFo::PdfOutputDevice device;
PoDoFo::PdfStreamedDocument document;
PoDoFo::PdfPainter painter;

所以使用device初始化是安全的document

于 2013-02-19T20:16:30.860 回答
4

有点儿。规则是成员变量按照它们在类声明中声明的顺序进行初始化。

在您的情况下,这很好,因为device在之前声明过document

然而,在以下情况下,我们有未定义的行为,尽管初始化列表的顺序。

class A {
public:
  A(int i) : b(i), a(b) { }
private:
  int a;
  int b;
}
于 2013-02-19T20:15:40.063 回答