3

constメンバーまたは既定のコンストラクターを持たないメンバーを初期化する前に、クラス コンストラクターの引数に対して何らかの処理を行う必要がある場合があります。

たとえば、Java ではこれを行うことができます (理由は聞かないでください。これは単なる例です)。

class A
{
    public A(int area, float aspectRatio) {
        int w = foo(area, aspectRatio);
        int h = bar(area, aspectRatio);
        image = new Image(w, h);
    }
    private final Image image;
}

C++ では、同じようになります

class A
{
public:
    A(int area, float aspectRatio)
         : image(foo(area, aspectRatio), bar(area, aspectRatio))
    {
    }
private:
    const Image image;
}

そして、複雑な初期化を必要とするメンバーが増えると、初期化リストはますます巨大になります。この問題を回避する方法はありますか?

UPD 1:
メンバーにコピー コンストラクターがない場合はどうなりますか? 例のように、各引数の計算を関数に抽出するだけですか?

4

2 に答える 2

4

そのための静的メンバー関数を記述します。

class A
{
public:
    A(int area, float aspectRatio)
         : image(initImage(area, aspectRatio))
    {
    }
private:
    const Image image;
    static Image initImage(int area, float aspectRatio) {
        int w = foo(area, aspectRatio);
        int h = bar(area, aspectRatio);
        return Image(w, h);
    }
};
于 2017-05-23T08:45:12.753 に答える