2013-03-14 5 views
1
struct OBJECT 
{ 
unsigned int Var1; 
std::string Str1; 
... 
bool YesNo; 
}; 

OBJECT Obj[ 327 ]; 

Я смущен о том, как обнулить Obj. Он имеет несколько различных типов элементов. Должен ли я установить все его члены в 0? Как ... Obj[0].Str = ""; ? Итак, вопрос в том, каков правильный способ сделать это?C++ Zero-out массив структур?

Моя попытка:

::memset(&Obj, 0, sizeof(Obj)); 

Я не уверен, если я делаю это правильно ...

Ох, и есть ли более быстрый способ обнуление массива?

+1

sizeof (TYPE) * 327 не сам объект –

+0

Укажите правильный конструктор по умолчанию. –

+0

@DenisErmolin Спасибо, что поймали это. – CLearner

ответ

9

Не делайте этого, потому что у вас нетривиальные элементы в вашей структуре (например, std::string). Вы можете это сделать, если все ваши члены являются только простыми типами данных, например int, char, double или указателями.

Правильный путь для этого типа структуры является то, чтобы определить конструктор, который инициализирует все члены правильно

struct OBJECT { 
    OBJECT() : Var1(0), YesNo(false), ... {} 

    unsigned int Var1; 
    std::string Str1; 
    ... 
    bool YesNo; 
}; 
+0

Хорошо, спасибо :) – CLearner

+0

Есть недостаток в этой идее : при добавлении нового члена легко забыть обновить конструкторы, в то время как * memset/std∷fill * не нужно обновлять. –

+1

@ Привет-Ангел Да, вы правы, пока у вас есть только тривиальные члены. Однако с более сложными членами 'memset' может даже быть опасным, потому что он топает над памятью члена. См. Http: // stackoverflow.com/q/2099692/1741542 для обсуждения неинициализированных переменных-членов. –

3

«Правильный» способ добавить метод-конструктор для структуры, которая инициализирует переменные-члены, которые не имеют конструкторов свои собственные, например:

OBJECT_STRUCT() 
: Var1(0) 
, YesNo(false) 
{ 
} 

В этом примере вы обратите внимание, что Str1 не был инициализирован; это потому, что std::string имеет свой собственный конструктор, который инициализирует его.

1

Либо предоставить собственный конструктор по умолчанию или использовать компилятор, определенный конструктор по умолчанию:

std::fill(std::begin(Obj), std::end(Obj), OBJECT()); 

Обратите внимание, что fill подхода заливки работать только если вы используете конструктор по умолчанию.

1

Вы должны изменить свое заявление на

struct OBJECT 
{ 
    unsigned int Var1; 
    std::string Str1; 
    ... 
    bool YesNo; 

    OBJECT() 
    : Var1() 
    , Str1() 
    , ... 
    , YesNo(false) 
    { 
     // Do Nothing 
    } 
}; 

Массив - который вы должны использовать над std::array или std::vector - инициализирует объекты.

Смежные вопросы