0
class a
{
   object guest;
}

a::a() : guest(required_argument)
{
}

问题是我需要在创建类对象之后调用来宾的构造函数。有没有办法做到这一点?

4

3 回答 3

5

如果你想保持guest作为一个对象,不。

如果您可以随意将其设为指针,则可以对其使用延迟初始化。

于 2013-01-06T18:02:32.700 回答
2

真正的问题是为什么需要guest在构造函数之后调用a构造函数?

guest是 的一部分,因此在' 的构造函数之后a调用其构造函数在术语上是矛盾的:一个对象只有在其所有子对象都已完全构造时才完全构造,因此完成' 构造函数的执行意味着完成的构造函数。 aaguest

当然,这并不意味着您不能只在 ' 的构造guest期间默认a构造并在之后为其分配不同的值,或者,如果您根本不希望guesta' 的构造期间构造对象,则使用指针(更好if 智能指针)用于对a和之间的关联进行建模object

于 2013-01-06T18:11:01.520 回答
1

我想在之后guest构造的原因是在构造. 在这种情况下,您可以将该功能外包到之前构造的单独类中。因此 hosthostguestguest

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(),并且纯虚函数将被调用(我确实遇到过这个错误并得到运行时错误“调用纯虚函数”,即使编译器应该能够检测到这一点)。

于 2013-01-06T18:28:01.327 回答