25

所以,我只是想知道我们怎样才能完全擦除或重置一个结构,以便它可以被重用?

我刚刚输入了这个,你去:

typedef struct PART_STRUCT
{
    unsigned int Id;
    std::string Label;
} Part;

typedef struct OBJECT_STRUCT
{
    std::vector< unsigned char > DBA;
    std::vector< Part > Parts;
    unsigned int Id;
} Object;

Object Engine;

// Initialize all members of Engine
// Do whatever with Engine
// ...
// Erase/Reset Engine value
4

3 回答 3

47

您可以为其分配一个构造的临时对象:

Part my_struct;

my_struct = Part(); // reset

C++11:

my_struct = {}; // reset
于 2013-03-03T07:27:34.250 回答
9

如果出于某种原因,我一心想要始终保持同一个对象,我只会编写一个reset方法,将所有值重置回原来的值。

与此类似的东西:

struct Test {
    int a;
    int b;
    Test(): a(0), b(100) {}
    void reset() {
        a = 0;
        b = 100;
    }
};

int main() {
    Test test;
    //do stuff with test
    test.reset(); //reset test
}
于 2013-03-03T07:39:50.340 回答
-1

好的做法是避免这种类型的构造(对两种不同的语义含义使用相同的变量,同时重置它)。当您(或其他人)修改您的代码并忘记您为两种不同用途共享一个变量时,它将不可避免地产生一个奇怪的错误。

唯一的理由是腾出一些内存空间,但是:

  • 您实际上不太可能需要这样的优化。
  • 即使你这样做了,编译器通常会发现堆栈上的一个变量不再使用并且可以被丢弃,你创建的新变量将因此有效地替换第一个变量。您不需要关心自己保留内存。
  • 如果你的变量在堆上,你最好只使用两个不同的指针。

但是如果你真的想要做这个重置,你必须写一个方法来做。C++ 中没有内置方法,因为它实际上需要调用 thedestructor然后再调用constructor

该解决方案my_struct = Part()仅在您destructor微不足道的情况下才有效。假设您在 中分配了指针std::vector,您必须delete在清空vector. 这就是它不能自动完成的原因:结构的清理可能需要特殊处理而不是简单的遗忘。

于 2013-03-03T07:40:01.147 回答