C ++ 11将结构重置为null的方法?

时间:2018-01-04 09:45:09

标签: c++ c++11 reset zero bullet

我正在学习一个物理库,它涉及创建信息结构,然后将它们传递给初始化函数:

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指针之类的东西,对吧?

2 个答案:

答案 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::optionalstd::optional

std::optional<btRigidBodyConstructionInfo> foo{ std::in_place, /*values...*/ };

然后在使用时使用*foo。稍后,您可以通过执行foo={};来使值为空。

要重新填充,您可以使用

foo = {std::in_place, /*values...*/};

foo.emplace( /*values...*/ );

您可以通过执行foo来测试if (!foo)是否已为空,并且您可以*foo访问该值(如果它为null,则为未定义的行为)。

这有点像指针,但它实际上是一个值类型。