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

OBJECT Obj[ 327 ]; 

Obj를 제로 아웃하는 방법에 대해 혼란스러워합니다. 그것에는 몇 가지 다른 유형의 요소가 있습니다. 모든 멤버를 0으로 설정해야합니까? Like ... Obj[0].Str = ""; ? 그래서 질문은, 그것을하는 적절한 방법은 무엇입니까?C++ 구조체 배열을 제로 아웃 하시겠습니까?

내 시도 :

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

내가 제대로 일을하고 있다면 나는 확실하지 않다 ...

아, 그리고는 거기 제로 아웃 배열에 대한 빠른 방법? 당신이주의 것 그 예에서

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

:

+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; 
}; 
당신은

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

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

에 배열 당신의 선언을 변경해야합니다

+0

그래, 고마워. :) – CLearner

+0

아이디어 단점이있다. : 새로운 멤버를 추가 할 때 생성자를 업데이트하는 것을 잊어 버리는 것은 쉽지만 * memset/std∷fill * 방법은 업데이트 할 필요가 없습니다. –

+1

@ Hi-Angel 네, 사소한 일을하는 한 당신 말이 맞아요. 더 복잡한 회원이라하더라도'memset'은 회원의 기억을 뛰어 넘기 때문에 위험 할 수도 있습니다. http : // stackoverflow를 참조하십시오.com/q/2099692/1741542에서 초기화되지 않은 멤버 변수에 대한 설명을 참조하십시오. –

3

은 "올바른"방법은 자신의, 예,의 생성자를하지 않아도 모든 멤버 변수를 초기화합니다 당신의 구조체에 대한 생성자 메서드를 추가하는 것입니다 Str1이 초기화되지 않았습니다. std::string에는 초기화하는 자체 생성자가 있기 때문입니다.

1

사용자 정의 기본 생성자를 제공하거나 컴파일러 정의 기본 생성자 사용 다음 중 하나를 기본 생성자를 사용하는 경우 fill 방법에만 작동 채우

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

참고.

1

모든 멤버를 초기화 생성자를 정의하는 것입니다 std::array 또는 std::vector 이상 - 개체를 초기화합니다.

관련 문제