C++ 使用来宾对象更改类中调用构造函数的顺序
问题是我需要在创建类“a object”后调用来宾的构造函数。有什么办法吗?如果您想将C++ 使用来宾对象更改类中调用构造函数的顺序,c++,class,constructor,C++,Class,Constructor,问题是我需要在创建类“a object”后调用来宾的构造函数。有什么办法吗?如果您想将来宾作为一个对象,请不要 如果您可以随意将其设置为指针,则可以对其使用延迟初始化。真正的问题是,为什么需要在一个的构造函数之后调用来宾的构造函数 guest是a的一部分,因此在a的构造函数之后调用其构造函数在术语上是一个矛盾:一个对象只有在其所有子对象都被完全构造时才被完全构造,因此,完成a构造函数的执行意味着完成guest构造函数的执行 当然,这并不意味着您不能在a的构造过程中默认构造guest,并在a的构造
来宾
作为一个对象,请不要
如果您可以随意将其设置为指针,则可以对其使用延迟初始化。真正的问题是,为什么需要在一个的构造函数之后调用来宾的构造函数
guest
是a
的一部分,因此在a
的构造函数之后调用其构造函数在术语上是一个矛盾:一个对象只有在其所有子对象都被完全构造时才被完全构造,因此,完成a
构造函数的执行意味着完成guest
构造函数的执行
当然,这并不意味着您不能在a
的构造过程中默认构造guest
,并在a
的构造过程中为其分配一个不同的值,或者,如果您根本不希望在a
的构造过程中构造guest
对象,则可以使用指针(如果使用智能指针更好)为了对a
和对象之间的关联进行建模,我假设guest
在host
之后构建guest
的原因是在构建guest
时需要host
的一些功能。在这种情况下,您可以将该功能导出到一个单独的类中,该类在guest
之前构建。因此
class a
{
object guest;
}
a::a() : guest(required_argument)
{
}
请注意,以下简单实现将失败
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 */
};
因为当传递给guest::guest()
时,这个还没有被构造,纯虚拟函数将被调用(我真的有一次遇到了这个错误,并且得到了运行时错误“pure virtual function called”,即使编译器应该能够检测到它)。这很遗憾,这是不可能的,但肯定有原因。无论如何,谢谢您的回答。@user1873947原因是如果对象
有一个构造函数,那么它不是一个POD,所以标准要求它被初始化。a类是主gui类,来宾对象是一个使用主gui资源的小部件。我将guest声明为std::shared_ptr,并在a的构造函数中调用make_shared,这就完成了工作。
class host : some_interface
{
/* some_data */
guest _guest;
public:
host(...)
: some_data(...)
, _guest(*this)
{}
/* more stuff */
};