1

2 番目のコンストラクターを呼び出す前に、何らかの処理を行いたいと考えています。例えば:


class Foo {
    Foo(){ displayWindow(); }

    //This is possible
    Foo(int bar) : Foo() { windowSize = bar; }

    //But how do I do processing before calling the second constructor?
    Foo(int bar, int baz) {
        addLabel(baz); // prototype = void addLabel(int)
        Foo(bar);
    }
}

これをどのように達成しますか (初期化関数を使用せずに)?

編集:例を更新しました。これで、デフォルトのコンストラクターが最後に発生する必要があることが示されました。そうでない場合、displayWindow は更新された変数を考慮しません。

4

3 に答える 3

5

このような:

Foo(int bar, int baz) :
    Foo(initializeAnotherStaticLibrary(bar, baz) == -1 ? bar : baz)
{
}

(コンストラクターの委譲は、C++11 以降でのみサポートされている機能であることに注意してください。)

于 2012-08-24T16:27:18.403 に答える
0

賢明なデフォルトがある場合は、それらを使用してください。これは、他のコンストラクターを呼び出す方法の問題全体を回避します。1つしかないためです。:)

class Foo {
  public:
    Foo(int bar = 100, int baz = 0) {
        if (baz) addLabel(baz);
        displayWindow();
        windowSize = bar;
    }
};

displayWindow()とにかくコンストラクターを呼び出すという考えには疑問がありますが。自分自身を完全に初期化する前に作業を開始するという醜いことに加えて...オブジェクトの構築がまだ完了していない場合はどうなりますか?(たとえば、のサブクラスがある場合Foo、そのコンストラクターはこの後に実行されます-仮想的なものがある場合、vtablesはおそらくそれらが行うと思う場所を指していません...)

于 2012-08-24T19:44:11.397 に答える
-1

これは配置演算子を介して可能であることがわかりました:


class Foo {
    Foo(){ displayWindow(); }

    //This is not possible either, since "type 'Foo' is not a direct base of 'Foo'"
    Foo(int bar) : Foo() { windowSize = bar; }

    //This is the solution using the placement operator
    Foo(int bar, int baz) {
        addLabel(baz);
        new (this) Foo(bar);
    }
}

これには注意点があると聞いたので、指摘していただけると助かります。

于 2012-08-24T18:30:12.453 に答える