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

问题描述 投票:0回答:2

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

btRigidBodyConstructionInfo rbInfo = (/*values...*/);
btRigidBody* rigidBody = new btRigidBody(rbInfo);

现在我想重置struct(null it)以重用它。我在SO上找到了另一个相同的问题,答案是创建一个零初始化的临时文件并将其设置为它,或者在C ++ 11之后:

rbInfo = {};

当我尝试这个时,我收到了消息:

“没有运算符”=“匹配这些操作数。

我很困惑,但后来发现这个语法试图调用默认构造函数(至少在我的编译器(Visual Studio 2017)中),而rbInfo没有任何。我有一种感觉,该语法与以下内容相同:

rbInfo = btRigidBodyConstructionInfo{};

在这种情况下,如果不设置单个成员,是否无法重置结构?我想到了memsetting,但这通常是一个坏主意,因为可能有类似vtable指针之类的东西,对吧?

c++ c++11 reset zero bullet
2个回答
4
投票

你的问题听起来有点像小XY problem

你陈述你的目标是

现在我想重置struct(null it)以重用它。

X是“重用结构”,但不知何故,“重置结构”的Y被混入。如果你想要做的就是重用结构,你可以这样做:

btRigidBodyConstructionInfo rbInfo = (/*values...*/);
btRigidBody* rigidBody = new btRigidBody(rbInfo);

rbInfo = {/*new values...*/};

或者,如果您的编译器太旧而无法支持该语法,那么:

rbInfo = btRigidBodyConstructionInfo(/*new values...*/);

1
投票

在C ++中,变量具有值,而不是引用,支持它们。这与大多数其他语言不同,其中变量是对可能值的引用。

有些语言的简单数据是实际值,而类总是引用。很少有语言具有类对象,其变量实际上是类的值。

(各种)值没有通用的“空”状态。通常,值不是“可空的”。在C ++中,您可以强制类型永远不会保存0的字节值。例如:

class Foo {
  Foo(){}
private:
  int x = -1;
};

这个非常简单的类永远不会让它的x值为0

对于某些类型的值,您可以逐字归零(将其所有字节设置为零)。对于其他类型的值,明确不允许这样做。

类似于可空的概念可以从零参数构造。如果是这种情况,并且您有一个副本或移动分配运算符,那么

foo = {};

将(通常)分配给foo一个临时的零参数构造Foo(假设fooFoo类型,和sane operator=超载)。

如果您的类型btRigidBodyConstructionInfo没有零参数构造函数,并且不是聚合,那么如果foo = {};foo,则不能执行btRigidBodyConstructionInfo foo;

你可以做foo = {construction arguments};,并假设一个理智的operator=它会做你想要的。

如果你想要一个可以为null的值类型,请考虑boost::optionalstd::optional

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

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

要重新填充它,您可以使用

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

要么

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.