繁体   English   中英

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

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

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

但是我需要稍微修改一些变量,例如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++ 有另一种方法来做到这一点?

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

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

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

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

您真正想要做的是让默认构造函数和其他构造函数都委托给一个接受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))
    {
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM