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