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

时间:2013-01-06 18:01:20

标签: c++ class constructor

class a
{
   object guest;
}

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

问题是我需要在创建类'对象后调用guest的构造函数。有办法吗?

3 个答案:

答案 0 :(得分:5)

如果您想将guest保留为对象,请

如果你可以自由地使它成为指针,你可以使用延迟初始化。

答案 1 :(得分:2)

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

guesta的一部分,因此在 a的构造函数之后调用的构造函数是矛盾:只有在完全构造了所有子对象时才完全构造对象,因此完成a构造函数的执行意味着完成guest构造函数的执行。

当然,这并不意味着您不能在guest构造期间默认构造a并在之后为其分配不同的值,或者,如果您不想要guesta构造期间根本要构造的对象,使用指针(如果是智能指针更好)来建模aobject之间的关联。

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