我具有以下类层次结构,其中Base类依赖于其派生类在其构造函数中为其提供参数:
class Member
{
public:
Member(int v);
};
class Base
{
public:
Base(const Member& m);
};
class Derived : public Base
{
public:
Derived() : m_(123), Base(m_) // <- here is the problem
{
}
private:
Member m_;
};
但是问题是,在Derived
的成员变量Base
所依赖的Derived
的构造函数中,首先调用m_
构造函数尚未初始化。
是否有一种方法可以强制编译器首先调用m_
的构造函数,还是应该只重做我的类层次结构?
答案 0 :(得分:2)
您可以通过使其成为您自己首先初始化的基类来模拟在基类之前对成员进行初始化。您可以将其包装为简单的类类型,并在phoneNumbers
之前让Derived
私自继承该类型。在下面的示例中,Base
具有Derived
,该Member _m;
已初始化,然后用于初始化Base
。
class Member
{
public:
Member(int) {}
};
class Base
{
public:
Base(const Member&) {}
};
// The new wrapper
struct member_wrapper
{
member_wrapper(int v) : m_(v) {}
Member m_;
};
class Derived : private member_wrapper, public Base
{
public:
Derived() : member_wrapper(123), Base(m_)
{ }
};
尽管在这种情况下,由于m_
已经是class
类型,并且Derived
没有其他类型的成员,因此您可以直接从Member
私有继承。如果您有非class
类型或在Base
之前需要初始化的同一类型的多个成员,则需要将它们包装起来。
class Member
{
public:
Member(int) {}
};
class Base
{
public:
Base(const Member&) {}
};
class Derived : private Member, public Base
{
public:
Derived() : Member(123), Base(*this)
{ }
};