【发布时间】:2018-06-14 00:32:52
【问题描述】:
我正在学习一个物理库,它涉及创建信息结构,然后将它们传递给初始化函数:
btRigidBodyConstructionInfo rbInfo = (/*values...*/);
btRigidBody* rigidBody = new btRigidBody(rbInfo);
现在我想重置结构(将其设为空)以重用它。我在 SO 上发现了另一个相同的问题,答案是创建一个零初始化的临时变量并将其设置为它,或者在 C++11 之后:
rbInfo = {};
当我尝试这个时,我得到了消息:
"没有运算符 "=" 匹配这些操作数。
我很困惑,但后来发现这种语法试图调用默认构造函数(至少在我的编译器中(Visual Studio 2017)),而 rbInfo 没有。我感觉该语法与以下内容相同:
rbInfo = btRigidBodyConstructionInfo{};
在这种情况下,如果不设置单个成员,就没有办法重置结构吗?我考虑过 memsetting,但这通常是个坏主意,因为可能存在诸如 vtable 指针之类的东西,对吧?
【问题讨论】:
-
如果你的类有一个合理的“空”状态,为什么不实现一个默认构造函数呢?
-
@VTT 我很确定这是隐式默认构造对象的正确语法。
-
@VTT I'm not ;)
-
如果你的类没有默认构造函数,你所说的“reset”是什么意思?要重置任何东西,必须有一个关于最终状态的规范——实际上,这通常意味着与默认构造对象相同的状态。如果没有默认构造函数,需要指定需要的结束状态,
-
@Zebrafish - 是的,设计上没有安全的方法。如果需要以某种方式初始化类型,通常是有原因的。该语言本身不允许您默认初始化某些内容,除非它显式或隐式地支持它。
标签: c++ c++11 reset zero bullet