2014-03-27 6 views
1

구성되어 :사용 목적 회원들은 내가 간단한 코드 다음 한

#include <iostream> 
#include <vector> 

template <class Derived> 
struct Base 
{ 
    Base() 
    { 
     static_cast<Derived*>(this)->foo(); 
    } 

    std::vector<int> m_ints; 
}; 

struct Derived : Base<Derived> 
{ 
    Derived() : Base() 
    { 
     std::cout << a; 
    } 

    void foo() 
    { 
     m_ints.push_back(37); 
     a = 4; 
    } 

    int a; 
}; 

int main() 
{ 
    Derived d; 
    return 0; 
} 

나는 객체가 생성 될 때 생성자를 호출하는 순서에 대해 알고. 생성자는 "most base -> down"에서 호출됩니다. 그래서 Base 생성자에서 Derived 객체는 완전히 구성되지 않았습니다.

1)

그것은 Derived::foo 더 터치를 Derived 객체를 할 수없는 경우, Base 생성자에서 Derived::foo 전화, 안전한가요? 제 말은 a = 4과 같은 라인이 없을 때 Base 오브젝트를 만지면됩니다.

2) 게시 된 코드를 실행하면 실제로 작동하지만, 그 때 존재하지 않아야하는 a을 건드리고 있습니다. 일한다는 보장인가? VS2013, VS2010 및 GCC 4.8.1 on Ideone에서 테스트했습니다.

+0

무엇을 하시겠습니까? – BlackMamba

+0

[this] (http://stackoverflow.com/a/23417203/2567683) –

답변

0

이 특정 경우에는 작동하지만 권장하지 않습니다. 코드가 미묘하게 변경되면 갑자기 논리가 깨질 수 있습니다 (예 : 누군가 foo 가상 메서드를 만드는 경우, 누군가가 생성자에서 데이터 멤버 a를 초기화하거나 파생 된 경우 ...).

기본 클래스에 파생 클래스의 정보가 필요한 경우 파생 클래스는 해당 정보를 기본 클래스의 생성자에 전달해야합니다. 이 클래스에서 값 37은 Derived의 생성자에서 Base의 생성자로 전달되어야합니다.

데이터 멤버 a를 초기화해야하는 경우 파생 클래스의 생성자에서 초기화해야합니다.

EDIT : C++ 11에서는 파생 클래스가 Base 생성자에 코드를 삽입하려는 경우 람다를 Base에 전달할 수 있습니다. Base는 단순히 생성자에서 람다를 실행합니다.

+0

답장을 보내 주셔서 감사합니다. Base 생성자에서 lambda를 호출 할 수 있도록 Derive do Base에서 람다를 전달하는 방법에 대한 추가 정보를 제공해 주시겠습니까? 그리고 실제 상황에서 Derive는 여러 생성자를 가지고 있으며 모든 것에 λ를 전달하고 싶지 않습니다. 다른 방법이 있습니까? – relaxxx