在构造函数中组织初始化程序列表的更好方法

时间:2017-05-23 08:42:22

标签: c++ member-initialization

有时需要在初始化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:
如果该成员没有复制构造函数该怎么办?只需为函数中的每个参数提取计算,如示例所示?

2 个答案:

答案 0 :(得分: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);
    }
};

答案 1 :(得分:3)

提取功能。

Image initImage(int area, float aspectRatio)
{
    return {foo(area, aspectRatio), bar(area, aspectRatio)};
}

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