C ++完全擦除(或重置)结构的所有值?

时间:2013-03-03 07:25:42

标签: c++

所以,我只是想知道我们怎么能完全擦除或重置一个结构才能重复使用?

我刚打了这个,你走了:

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

3 个答案:

答案 0 :(得分:28)

您只需为其分配一个构造的临时文件:

Part my_struct;

my_struct = Part(); // reset

C ++ 11:

my_struct = {}; // reset

答案 1 :(得分:6)

如果由于某种原因我一心想要不断保持同一个对象,我只想写一个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
}

答案 2 :(得分:-1)

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

唯一的理由是节省一些内存空间,但是:

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

但如果你真的想要重置,你必须编写一个方法来完成它。在C ++中没有内置方式,因为它实际上需要再次调用destructor然后调用constructor

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