2014-02-13 5 views
0

초기화를 위해 멤버 객체를 부모 객체에 전달하는 클래스를 만들고 싶습니다. 아래 코드는 제가하려고하는 것을 보여줍니다.클래스의 멤버 객체를 기본 클래스의 생성자에 전달하는 방법은 무엇입니까?

class TQueueViewerForm1 : public TQueueViewerForm 
{ 
private: // User declarations 
    DOMMsgCollectionEditorImpl m_collection; 
public:  // User declarations 
    __fastcall TQueueViewerForm1(TComponent* Owner); 
}; 

__fastcall TQueueViewerForm1::TQueueViewerForm1(TComponent* Owner) 
    : TQueueViewerForm(Owner, m_collection) 
{ 
} 

그러나 이것은 작동하지 않습니다. m_collection이 초기화되기 전에 TQueueViewerForm()이 호출되고있는 것처럼 보입니다. TQueueViewerForm()이 초기화되지 않은 객체를 사용하려고하기 때문에 프로그램이 충돌합니다.

여기 내 선택은 무엇입니까? 이상적으로 부모 클래스가 어떻게 든 초기화되기 전에 m_collection을 초기화하고 싶습니다.

답변

0

파생 클래스의 상위 생성자는 자식 생성자보다 먼저이 호출됩니다. 입니다. 하나의 옵션은 실행하려고하는 초기화 코드를 부모 클래스의 별도 함수에 넣고 그 함수를 파생 클래스의 생성자에서 호출하는 것입니다.

1

상속을 통한 작업 순서를 기억해야합니다. 클래스의 인스턴스를 만들 때 먼저 기본 구성 요소가 구성됩니다 (즉, 기본 클래스 생성자가 완료 될 때까지 실행 됨). 그런 다음 클래스 멤버가 초기화되고 클래스 생성자가 실행됩니다.

이 경우 초기화하기 전에 다소 임의의 메모리를 기본 클래스로 전달합니다.

0
class CollectionHolder { 
public: 
    DOMMsgCollectionEditorImpl m_collection; 
}; 

class TQueueViewerForm1 : 
    private CollectionHolder, // important: must come first 
    public TQueueViewerForm { 
}; 

내 취향에 너무 미묘합니다. 개인적으로, 나는 그러한 체조를 수행 할 필요가없는 디자인을 찾으려고 노력할 것입니다.

+0

오 와우. 이것은 문제를 해결할 것이지만 나는 그런 종류의 코드를 작성한 자신을 용서할 수 있다고 생각하지 않는다 ... – QuestionC

+0

동의. 이는 코드 기반에 익숙하지 않은 새로운 사람에게 지나치게 복잡해 보이고 유지 보수 노력의 가치가없는 것으로 보입니다. 문제를 다시 생각하고 다른 접근 방식을 시도하는 것이 가장 좋습니다. – jia103

0

파생 클래스 생성자의 초기화 목록을 사용하여 기본 클래스 생성자에 매개 변수를 전달할 수 있습니다.

class Parent 
{ 
public: 
    Parent(std::string name) 
    { 
     _name = name; 
    } 

    std::string getName() const 
    { 
     return _name; 
    } 

private: 
    std::string _name; 
}; 

// 
// Derived inherits from Parent 
// 
class Derived : public Parent 
{ 
public: 
    // 
    // Pass name to the Parent constructor 
    // 
    Derived(std::string name) : 
    Parent(name) 
    { 
    } 
}; 

void main() 
{ 
    Derived object("Derived"); 

    std::cout << object.getName() << std::endl; // Prints "Derived" 
} 
관련 문제