9

私はいくつかのコードを書き直してグローバル変数を排除し、クラス コンストラクター/デストラクターがサード パーティ ライブラリ リソースのクリーンアップを処理するようにしましたが、クラス初期化子リスト内の別のメンバーから 1 つのメンバーを初期化するコードについて懸念しています。

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 に答える