class a
{
object guest;
}
a::a() : guest(required_argument)
{
}
问题是我需要在创建类对象之后调用来宾的构造函数。有没有办法做到这一点?
class a
{
object guest;
}
a::a() : guest(required_argument)
{
}
问题是我需要在创建类对象之后调用来宾的构造函数。有没有办法做到这一点?
如果你想保持guest
作为一个对象,不。
如果您可以随意将其设为指针,则可以对其使用延迟初始化。
真正的问题是为什么需要guest
在构造函数之后调用a
构造函数?
guest
是 的一部分,因此在' 的构造函数之后a
调用其构造函数在术语上是矛盾的:一个对象只有在其所有子对象都已完全构造时才完全构造,因此完成' 构造函数的执行意味着完成的构造函数。 a
a
guest
当然,这并不意味着您不能只在 ' 的构造guest
期间默认a
构造并在之后为其分配不同的值,或者,如果您根本不希望guest
在a
' 的构造期间构造对象,则使用指针(更好if 智能指针)用于对a
和之间的关联进行建模object
。
我想在之后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()
,并且纯虚函数将被调用(我确实遇到过这个错误并得到运行时错误“调用纯虚函数”,即使编译器应该能够检测到这一点)。