我有这个类,它有许多类成员和许多不同的构造函数。
到目前为止,我在我拥有的每个构造函数中都使用了一个构造函数初始化列表,以我想要的方式调整每个成员。
这相当繁琐,因为每次我向类中添加新成员时,我都必须访问每个构造函数并更新初始化列表以向该成员添加默认值。
所以,我想我会添加一个方法来初始化我需要的值。问题!由于该方法是在初始化列表之后执行的,因此我放入此初始化列表中的特定值将被我的方法覆盖。
快速示例:
class A
{
public:
A();
A( B b );
A( int i );
// A( .... ); plenty of them
private:
int member1, m2, m3,m4;
bool b1,b2, b3;
// ....
// every time I add a member I have to modify the initialization lists
// solution: agregate member initialization in a member function:
void init_members();
}
// init list constructors
A::A() : m1(false), m2(false), m3(false), m4(true) .... // looong list
{
}
A::A( B b) : m1(b.state()), m2(false), m3(false), ... // loong list
{
}
// problem, if I use init_members:
void A::init_members()
{
m1 = false;
m2 = false;
m3 = false;
// ...
}
A::A( int i ) : m1( true)
{
init_members(); // overrides m1 !!!
}
所以,我的问题是:我可以混合使用列表初始化器和方法初始化器,以便列表初始化器优先于方法初始化器吗?
在上面的示例中,我希望 m1 保留true
最后一个构造函数。
注意:我知道我可以在方法调用之后移动初始化列表,但这意味着我会为成员分配两次值:一次init_members()
,然后在构造函数中覆盖它。不够优化:-)
我希望有一些小技巧,如果你有库存的话。