我创建了一个GameObject
类,其中有2个构造函数。一个默认值GameObject () = default;
,但在初始化工作表中由我自己初始化。在第二个构造函数GameObject(vec3 pos, vec3 rot, vec3 scale)
中,我想在init列表中添加一个默认构造函数,使其具有相同的参数。
但是我需要稍微修改一些变量,例如从transform(Transformation((*this))
到transform(Transformation((*this), position, rotation, scale)
。
但是由于出现错误,我无法这样做
“委派的构造函数不能进行其他内存初始化”。
此模板代码:
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 ++有另一种方法可以做到这一点?
一旦处于构造函数的主体中,该类型的所有子对象(基类和非静态数据成员)都被视为活动的有效对象,因此必须事先进行初始化。这是构造函数的成员初始化列表的目的。
但是,允许成员初始化列表做一些奇怪的事情。它实质上可以将对象及其子对象的主要初始化委托给其他一些构造函数。这是在成员初始化列表中调用类的构造函数时发生的情况。执行此操作的构造函数称为委托构造函数。
这当然意味着,当时间控制权返回到委托的构造函数时,所有成员都已经已经初始化。因此,委托给另一个构造函数的成员初始化列表将all成员初始化委托给该构造函数。它不能具有其他成员初始化程序,因为这些成员已经被初始化。
这就是您得到错误的原因。
您真正想要做的是拥有默认的构造函数,而您的其他构造函数都委托给带有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))
{
}