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
, Вот почему это не может быть сделано автоматически: очистка конструкции может потребовать специальной обработки, а не простого забывания.