Ответ 1
Вы можете просто назначить для него построенное временное значение:
Part my_struct;
my_struct = Part(); // reset
С++ 11:
my_struct = {}; // 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
Вы можете просто назначить для него построенное временное значение:
Part my_struct;
my_struct = Part(); // reset
С++ 11:
my_struct = {}; // reset
Если по какой-то причине я был склонен к тому, чтобы постоянно поддерживать один и тот же объект, я бы просто написал метод 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
}
Хорошая практика заключается в том, чтобы избежать этого типа конструкции (используя ту же переменную для двух разных семантических значений, имея reset в то же время). Это неизбежно создаст странную ошибку позже, когда вы (или кто-то еще) измените свой код и забудете, что вы разделили переменную для двух разных целей.
Единственное оправдание - это зарезервировать некоторое пространство памяти, но:
Но если вы действительно хотите сделать это reset, вы должны написать метод для этого. В С++ нет встроенного способа, потому что на самом деле потребуется снова вызвать destructor
, а затем constructor
.
Решение my_struct = Part()
работает только в том случае, если ваш destructor
тривиален. Скажем, вы указали указатель в std::vector
, вам нужно было бы надлежащим образом delete
указать каждый указатель перед опустошением vector
. Вот почему это невозможно сделать автоматически: очистка структуры может потребовать специального лечения, а не простого забывания.