[英]Changing order of calling constructors in class with guest object
class a
{
object guest;
}
a::a() : guest(required_argument)
{
}
问题是,我需要在创建类的对象后调用来宾的构造函数。 有办法吗?
如果要让guest
作为对象,则不会。
如果可以随意将其用作指针,则可以对其使用延迟初始化。
真正的问题是,为什么你需要做guest
的构造函数后调用a
构造函数“?
guest
是的一部分a
,所以具有其构造后调用a
的构造是自相矛盾的 :只有当它所有的子对象被完全构造,因此在完成的执行对象被完全构造a
的构造意味着完成guest
的构造函数的执行。
当然,这并不意味着你不能仅仅通过缺省方式构造guest
中a
的建设和后为其分配一个不同的值,或者,如果你不想做guest
时都被构造的对象a
的建设“,使用用于对a
和object
之间的关联进行建模的指针(最好是智能指针)。
我想在 host
之后构造guest
的原因是在guest
的构造中需要host
某些功能。 在这种情况下,您可以将该功能外包给在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()
时尚未构造,并且纯虚函数将被调用(即使编译器编译此错误,我也确实遇到过一次运行时错误“纯虚函数调用”)应该能够检测到这一点)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.