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 ответа

Решение

Вы можете просто назначить ему созданный временный объект:

Part my_struct;

my_struct = Part(); // reset

C++ 11:

my_struct = {}; // 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
}

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

Единственным оправданием было бы сэкономить место в памяти, но:

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

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

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

Другие вопросы по тегам