С++ полностью стирает (или reset) все значения структуры?

Итак, мне просто интересно, как мы можем полностью удалить или reset структуру, чтобы ее можно было повторно использовать?

Я просто набрал это, вот вы:

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

Ответ 1

Вы можете просто назначить для него построенное временное значение:

Part my_struct;

my_struct = Part(); // reset

С++ 11:

my_struct = {}; // reset

Ответ 2

Если по какой-то причине я был склонен к тому, чтобы постоянно поддерживать один и тот же объект, я бы просто написал метод reset, который бы 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
}

Ответ 3

Хорошая практика заключается в том, чтобы избежать этого типа конструкции (используя ту же переменную для двух разных семантических значений, имея reset в то же время). Это неизбежно создаст странную ошибку позже, когда вы (или кто-то еще) измените свой код и забудете, что вы разделили переменную для двух разных целей.

Единственное оправдание - это зарезервировать некоторое пространство памяти, но:

  • Очень маловероятно, что вам действительно нужна такая оптимизация.
  • Даже если вы это сделаете, компилятор, как правило, выяснит, что переменная в стеке больше не используется и может быть отброшена, новая переменная, которую вы создадите, эффективно заменит ее. Вам не нужно заботиться о том, чтобы сохранить память самостоятельно.
  • Если ваши переменные находятся в куче, вам лучше использовать только два разных указателя.

Но если вы действительно хотите сделать это reset, вы должны написать метод для этого. В С++ нет встроенного способа, потому что на самом деле потребуется снова вызвать destructor, а затем constructor.

Решение my_struct = Part() работает только в том случае, если ваш destructor тривиален. Скажем, вы указали указатель в std::vector, вам нужно было бы надлежащим образом delete указать каждый указатель перед опустошением vector. Вот почему это невозможно сделать автоматически: очистка структуры может потребовать специального лечения, а не простого забывания.