2017-05-23 15 views
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:
如果该成员没有一个拷贝构造函数?就像在例子中一样,为每个参数提取计算?

+1

为了解决UPD1:它只需要一个移动ctor(我相信自从C++ 17以来,甚至没有)。 – Angew

回答

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); 
    } 
}; 
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; 
} 
相关问题