2010-12-09 3 views
3

나는 C++에서 다음 struct를 가지고 있는데, 다음과 같이 사용할 때 기본이 아닌 생성자를 정의해야하는지 궁금해했습니다. boost::shared_ptr<node> p_node = boost:shared_ptr<node>();이 구조체는 기본이 아닌 생성자가 필요합니다.

struct node 
{ 
    std::string name; 
    std::map<std::string, std::vector<variant> > values; // it is possible that nodes contain as a value, key/value pairs so we need a map 

    NodeType type; //Enum 

    typedef struct attrib 
    { 
     std::string key; 
     variant value; //Boost::variant 
    }; 

    std::vector<attrib> attributes; 

    boost::shared_ptr<node> childnode; 
}; 
+4

이것은 * 아닙니다 * a POD –

답변

4

"이 작업을 수행합니까? POD는 기본이 아닌 생성자를 필요로합니다. "... what POD? POD에는 문자열이나지도와 같은 복잡한 객체가 포함되어 있지 않습니다. POD는 복식 및 문자 배열과 같은 일반 오래된 데이터를 나타냅니다.

생성자가 필요한지는 모든 데이터가 올바른 상태로 초기화되는지 여부에 따라 다릅니다. std::map, std::vectorstd::string은 모두 비어 있어야합니다. 다른 boost::shared_ptrNULL입니다. attrib은 형식 일 뿐이므로 처음에는 attrib 객체가 없으므로 걱정할 필요가 없습니다. 그러나 NodeType enum은 생성자에서 직접 수행하지 않는 한 어디서나으로 초기화되지 않습니다. 그게 중요합니까? 오직 당신 만이 결정할 수 있지만, 기술적으로 당신은 그것을 읽기 전에 어딘가에 그것을 할당해야합니다. 그렇지 않으면 기술적으로 정의되지 않은 행동을 취합니다.

2

이 값은 not a POD입니다.

예,이 구조체에는 기본 ctor가 필요합니다. 그렇지 않으면 열거 형 멤버는 기본 구성 후 정의되지 않은 값을 갖기 때문입니다. 그것은 당신이 그것을 사용하는 방법 - 또는, 귀하의 예제 코드에서와 같이 전혀 사용하지 마십시오. 그냥 NULL을 공유하는 ptr을 초기화하고 쓸 수도 있습니다.

+0

유형 구성원은 잠재적으로 * 정의되지 않은 값을 가질 수 있습니다. 컴파일러가 생성 한 기본 생성자는 상황에 따라'zero-initialization'과'default initialization' 둘 다 할 수 있습니다. 정적 저장 기간 ([basic.start.init])의 변수는 0으로 초기화됩니다. 빈 괄호()로 선언 된 자동 또는 동적 저장 기간의 변수는 사용자 정의 생성자가없는 경우 ([dcl.init] 단락 8) 구성원의 초기화를 0으로 만드는 '값 초기화'입니다. 'zero-initialization'은 POD 값 (enum과 같은)을 0으로 설정합니다. –

+0

@ M.Y .: 예,이 모든 것을 고려해 볼 때 적절한 초기화를 수행하는 기본 ctor를 추가하는 것이 좋습니다 .-) –

1

1) 구조체 또는 클래스에 0 또는 1 또는 n 매개 변수가있는 생성자를 정의하면 C++ 기본 생성자가 자동으로 만들어지지 않습니다.

이제 모든 것은 생성자 호출에만 의존합니다.

객체를 만들면 Node * x = new Node(); 이것은 매개 변수가없는 생성자를 호출해야하며 클래스에는 매개 변수가없는 생성자가 있어야합니다. [Read First Line Again].

구조체 또는 클래스에 매개 변수가없는 생성자가 있는지 확인합니다. C++에서 임의의 수의 매개 변수로 생성자를 생성하면 기본 생성자가 자동으로 C++ 인터프리터에 의해 작성되지 않습니다.

라인 1은 이해하는 것이 매우 중요합니다.

관련 문제