如何在初始化列表中的构造函数之后初始化变量/对象?
How i can init variable/object after constructor in initialize list?
我创建了一个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))
{
}
相关文章:
- 初始值设定项列表是否只接受使用相同类型的值初始化变量?
- 在 C++ 中访问 lambda 捕获初始化变量
- 为什么C++不支持对未初始化变量进行智能分析?
- 使用 clang++ 和 g++ 在C++中初始化变量
- C++使用 lambda 初始化变量
- 如何在初始化列表中的构造函数之后初始化变量/对象?
- C++ - 输出与初始化变量不同?
- C++/Win32 构造函数不使用从对话框获取的字符串初始化变量
- 在C++中,为什么int可以使用new运算符初始化变量,而double不能
- 具有静态存储持续时间的常量初始化变量的初始化顺序
- C++ 中的初始化变量
- C++中未初始化变量的值
- 如何在需要提及需要循环声明的其他类的类中初始化变量?
- 我想知道在构造函数中初始化变量时的生命周期
- 读取恰好具有良好值的未初始化变量
- 如何在 getter 的父类中初始化变量的情况下访问子类中的变量
- 为什么在 c++ 中有多种初始化变量的方法
- 没有参数的默认构造函数是否总是初始化变量?
- 是否可以使用 lambda 初始化变量(删除复制 ctor 时)
- 使用构造函数跳闸UB的新放置后使用初始化变量