2017-04-05 3 views
1

나는 구조체C++은 클래스 생성에 클래스 생성 멤버를 사용합니까?

struct MyStruct { 
    MyStruct(XML cfg) { ... } 
    int m_1, m_2, ... ; 
} 

그리고 컴파일러는 MYSTRUCT 빈 생성자

error: no matching function for call to ‘MyStruct::MyStruct()’ 
MyClass(XML cfg) { m_struct = MyStruct(cfg); } 
내가 TEH 상속 플레이를 해달라고 생각이 없음을 불평 이제

class MyBaseClass { 
    public: 
    MyBaseClass() {}  
    MyStruct m_struct; 
} 

class MyClass : public MyBaseClass { 
    public: 
    MyClass(XML cfg) { m_struct = MyStruct(cfg); }   
} 

수업을해야합니까 역할은 그렇다. 그러나 그것이 사실일지도 모르는 것에 따라 나는 완전을 위해 그것을 유지했다. MyStruct에 대해 명시 적으로 빈 생성자를 호출하지 않습니다. m_struct가 멤버이기 때문에 MyClass 클래스가 그렇게합니까?
그렇다면 멤버를 초기화하지 않는 방법이 있습니까? 아니면 포인터로만 멤버로 사용할 수 있습니까?

은 난 그냥 내 구조에 빈 생성자를 추가하거나

MyClass(XML cfg) : m_struct = MyStruct(cfg) {} 

에 생성자를 변경하여이 문제를 해결할 수 있습니다 알고 있지만 정확히 여기 무슨 일이 일어나고 있는지 알고 궁금합니다.

+0

'struct'와'class'는 같습니다. 여기서는 유용한 범주를 형성하지 않습니다. – juanchopanza

+0

공용 멤버가 두 개인 경우에만 struct가 사용됩니다. 클래스 자체는 여기에 제 예제보다 훨씬 더 많이 포함하고 있습니다. 저는 제 예제에서 minimals를 시도하려고합니다. – chrise

+0

상속은 실제로 여기서 아무런 역할을하지 않습니다. MyClass를 완전히 제거하고, MyBaseClass를 인스턴스화하며, 정확히 동일한 문제를 가질 수 있습니다. – WhozCraig

답변

1

클래스 구성에 클래스 구성 단원이 있습니까?

물론 그렇습니다. 이 문제는 MyBaseClass의 생성자에서 발생합니다. 즉, m_struct 멤버를 명시 적으로 초기화하지 않으면 기본적으로 초기화되지만 MyStruct에는 기본 생성자가 없습니다.

데이터 멤버뿐 아니라 기본 클래스 개체에도 해당됩니다. MyClass의 생성자에 대해서는 명시 적으로 기본 클래스의 생성자를 지정하지 않고 MyBaseClass의 기본 생성자가 호출 된 다음 위의 설명과 같이 오류가 발생합니다.

당신은 MyStruct의 기본 생성자를 추가하거나 회원 m_struct을 초기화하기 위해 명시 적으로 MyStruct::MyStruct(XML cfg) 전화, MyBaseClass의 생성자에서 member intializer list을 사용할 수 있습니다. 예 :

MyBaseClass() : m_struct(some_thing) {} 
+0

고마워. 나는 그 사실을 알지 못했다.나는 스마트 포인터를 멤버로서 인스턴스 자체로 사용했기 때문에 C++로 땜질하는 몇 주 동안 실제로 그 문제를 우연히 발견하지 못했다. – chrise

+0

@chrise 스마트 포인터는 디폴트로 생성 될 수있다; 그래서 모든 것이 좋습니다. – songyuanyao

1

멤버 이니셜 라이저를 생략하면 컴파일러는 인수를 사용하지 않고 멤버 이니셜 라이저를 삽입합니다. 따라서 오류.

이것은 또한 컴파일러 본문에서 멤버를 초기화하는 첫 번째 추출에서 컴파일러가 허용하는 경우 멤버가 두 번 초기화된다는 것을 의미합니다. 이런 식으로 코드를 작성하지 마십시오.