Лучший способ организовать списки инициализаторов в конструкторах

Иногда перед инициализацией необходимо выполнить некоторую обработку аргументов конструктора класса. 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 ответа

Решение

Напишите для него статическую функцию-член:

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

Извлечь, чтобы функционировать.

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;
}
Другие вопросы по тегам