我正在学习一个物理库,它涉及创建信息结构,然后将它们传递给初始化函数:
btRigidBodyConstructionInfo rbInfo = (/*values...*/);
btRigidBody* rigidBody = new btRigidBody(rbInfo);
现在我想重置struct(null it)以重用它。我在SO上找到了另一个相同的问题,答案是要创建一个零初始化临时文件并将其设置为它,或者在C ++ 11之后:
rbInfo = {};
当我尝试这个时,我收到了消息:
“No operator”=“匹配这些操作数。
我很困惑,但后来发现这种语法试图调用默认构造函数(至少在我的编译器(Visual Studio 2017)中),并且rbInfo没有。我有一种感觉,语法与:
相同rbInfo = btRigidBodyConstructionInfo{};
在这种情况下,如果不设置个别成员,是否无法重置结构?我想到了memsetting,但这通常是一个坏主意,因为可能有像vtable指针之类的东西,对吧?
答案 0 :(得分:4)
您的问题听起来有点像XY problem。
你说明你的目标是
现在我想重置struct(null it)以重用它。
X 是“重用结构”,但不知何故,“重置结构”的 Y 混入了。如果你想做的就是重用结构,你可以这样做:
btRigidBodyConstructionInfo rbInfo = (/*values...*/);
btRigidBody* rigidBody = new btRigidBody(rbInfo);
rbInfo = {/*new values...*/};
或者,如果您的编译器太旧而无法支持该语法,那么:
rbInfo = btRigidBodyConstructionInfo(/*new values...*/);
答案 1 :(得分:1)
在C ++变量中有值,而不是引用,支持它们。这与大多数其他语言不同,其中变量是对可能值的引用。
有些语言的简单数据是实际值,而类总是引用。很少有语言具有类对象,其变量实际上是类的值。
(各种)值没有通用的“null”状态。通常,值不是“可空的”。在C ++中,您可以强制类型永远不会保存0
的字节值。例如:
class Foo {
Foo(){}
private:
int x = -1;
};
这个非常简单的类永远不会让x
值为0
。
对于某些类型的值,您可以逐字归零(将其所有字节设置为零)。对于其他类型的值,明确不允许这样做。
类似于可为空的概念可以从零参数构造。如果是这种情况,并且您有一个副本或移动分配运算符,那么
foo = {};
将(通常)分配给foo
一个临时的零参数构造Foo
(假设foo
类型为Foo
,并且理智operator=
重载
如果您的类型btRigidBodyConstructionInfo
没有零参数构造函数,并且不是聚合,那么如果foo = {};
为foo
,则您无法btRigidBodyConstructionInfo foo;
。
你可以做foo = {construction arguments};
,并假设一个合理的operator=
它会做你想要的。
如果您想要可以为空的值类型,请考虑boost::optional
或std::optional
。
std::optional<btRigidBodyConstructionInfo> foo{ std::in_place, /*values...*/ };
然后在使用时使用*foo
。稍后,您可以通过执行foo={};
来使值为空。
要重新填充,您可以使用
foo = {std::in_place, /*values...*/};
或
foo.emplace( /*values...*/ );
您可以通过执行foo
来测试if (!foo)
是否已为空,并且您可以*foo
访问该值(如果它为null,则为未定义的行为)。
这有点像指针,但它实际上是一个值类型。