当使用委托构造函数时,不能在委托构造函数的定义中包含其他成员初始化项。例如:
class Foo {
public:
Foo(int a) : m_a(a) {}
Foo() : Foo(0), m_b(1) {} // Error: A delegating constructor cannot have other mem-initializers
private:
int m_a, m_b;
};
在这个例子中,我们试图用一个委托构造函数来调用别的构造函数,并且在这个委托构造函数的定义中还包括了一个成员初始化项。这是不允许的,因为委托构造函数的目的就是让代码更简洁,避免重复,而其他成员初始化项则会破坏这种简洁性。
为了解决这个问题,我们需要修改代码,去掉委托构造函数中的成员初始化项。例如:
class Foo {
public:
Foo(int a) : m_a(a) {}
Foo() : Foo(0) {} // OK
private:
int m_a, m_b = 1;
};
在这个修改后的代码中,我们去掉了委托构造函数中的成员初始化项,并把这个初始化项移动到了类的成员变量中去。这样就可以避免上述错误,并保持代码的简洁性。