class a
{
object guest;
}
a::a() : guest(required_argument)
{
}
问题是我需要在创建类'对象后调用guest的构造函数。有办法吗?
答案 0 :(得分:5)
如果您想将guest
保留为对象,请
如果你可以自由地使它成为指针,你可以使用延迟初始化。
答案 1 :(得分:2)
真正的问题是为什么你需要在guest
的构造函数之后调用a
的构造函数吗?
guest
是a
的一部分,因此在 a
的构造函数之后调用的构造函数是矛盾:只有在完全构造了所有子对象时才完全构造对象,因此完成a
构造函数的执行意味着完成guest
构造函数的执行。
当然,这并不意味着您不能在guest
构造期间默认构造a
并在之后为其分配不同的值,或者,如果您不想要guest
在a
构造期间根本要构造的对象,使用指针(如果是智能指针更好)来建模a
和object
之间的关联。
答案 2 :(得分:1)
我认为在 guest
之后构建的host
的原因是host
的构造需要guest
的某些功能。在这种情况下,您可以将该功能外包到一个单独的类中,该类在guest
之前构建。因此
class some_interface { /* some abstract functionality needed by guest::guest() */ };
class guest
{
public:
guest(some_interface const&); // calls pure virtual functions of some_interface
/* more stuff */
};
class host_interface : public some_interface
{
/* implements pure virtual methods of its base */
};
class host
{
host_interface _interface;
guest _guest;
public:
host(...)
: _interface(...)
, _guest(_interface)
{}
/* more stuff */
};
请注意,以下天真实施将失败
class host : some_interface
{
/* some_data */
guest _guest;
public:
host(...)
: some_data(...)
, _guest(*this)
{}
/* more stuff */
};
因为传递给this
时尚未构造guest::guest()
,并且将调用纯虚函数(我确实曾经有过这个错误并获得了运行时错误“称为纯虚函数”,即使编译器应该能够检测到这一点)。