在构造函数中组织初始化列表的更好方法
Better way to organize initializer lists in constructors
有时需要在初始化 const
成员或那些没有默认构造函数的成员之前对 class 构造函数参数进行一些处理。
比如在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:
如果成员没有拷贝构造函数怎么办?只是像示例中那样为函数的每个参数提取计算?
为它写一个静态成员函数:
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;
}
有时需要在初始化 const
成员或那些没有默认构造函数的成员之前对 class 构造函数参数进行一些处理。
比如在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:
如果成员没有拷贝构造函数怎么办?只是像示例中那样为函数的每个参数提取计算?
为它写一个静态成员函数:
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;
}