繁体   English   中英

使用来宾对象更改类中调用构造函数的顺序

[英]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的构造函数的执行。

当然,这并不意味着你不能仅仅通过缺省方式构造guesta的建设和后为其分配一个不同的值,或者,如果你不想做guest时都被构造的对象a的建设“,使用用于对aobject之间的关联进行建模的指针(最好是智能指针)。

我想 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM