如何在初始化列表中的构造函数之后初始化变量/对象?

How i can init variable/object after constructor in initialize list?

本文关键字:初始化 变量 之后 构造函数 对象 列表      更新时间:2023-10-16

我创建了一个GameObject类,其中有 2 个构造函数。一个默认GameObject () = default;,但在初始化表中初始化变量。在第二个构造函数GameObject(vec3 pos, vec3 rot, vec3 scale)中,我想在 init 列表中添加一个默认构造函数,以便它具有相同的参数。

但是我需要稍微修改一些变量,例如transform(Transformation((*this))transform(Transformation((*this), position, rotation, scale).

但我做不到,因为我有错误

"委托的构造函数不能有其他 MEM 初始化"。

这是一个模板代码:

class GameObject
{
//params .....

GameObject::GameObject()
:  transform(Transformation((*this))), render(true)
{
}
GameObject::GameObject(glm::vec3 position, glm::vec3 rotation, glm::vec3 scale)
: GameObject(),
transform(Transformation((*this), position, rotation, scale) //here a error
{
}
}

我该如何解决这个问题?或者也许C++有另一种方法可以做到这一点?

一旦您进入构造函数的主体,该类型的所有子对象(基类和非静态数据成员(都被视为实时的有效对象,因此必须事先初始化。这是构造函数的成员初始化列表的用途。

但是,允许成员初始化列表执行一些奇怪的操作。它实质上可以将对象及其子对象的主初始化委托给其他构造函数。这就是在成员初始化列表中调用类的构造函数时发生的情况。执行此操作的构造函数称为委托构造函数。

这当然意味着,当控件返回到委托构造函数时,所有成员都已初始化。因此,委托给另一个构造函数的成员初始化列表将所有成员初始化委托给该构造函数。它不能有其他成员初始值设定项,因为这些成员已经初始化。

这就是您收到错误的原因。

您真正想要做的是让默认构造函数和另一个构造函数都委托给采用Transform对象的构造函数,该构造函数将用于初始化相应的成员:

GameObject::GameObject()
:  GameObject(Transformation((*this))), render(true))
{
}
GameObject::GameObject(glm::vec3 position, glm::vec3 rotation, glm::vec3 scale)
: GameObject(Transformation((*this), position, rotation, scale))
{
}
private:
explicit GameObject::GameObject(Transformation &&tf) : transform(std::move(tf))
{
}