2011-09-21 5 views
1

부스트 난수 생성기를 사용하려는 객체가있는 특정 상황이 있는데 더 큰 문제가 있습니다. 나는 대답 할 수없는 것처럼 보입니다. 다음은 내가 생산하려고 시도하는 예제 코드입니다.C++에서 기본이 아닌 생성자를 사용하여 객체의 멤버 클래스 초기화

첫째, 내 헤더 :

Class MyObject { 

protected: 
    double some variable; 
    boost::random::mt19937 rgenerator; 
    boost::uniform_real<double> dist_0_1; 
    boost::variate_generator< boost::mt19937&, boost::uniform_real<double> > rand01 
} 

이제 어떻게 내가하고 싶은 것은 :

Class MyObject { 

protected: 
    double some variable; 

    boost::random::mt19937 rgenerator(std::time(0)); //initialize to a "random" seed 
    boost::uniform_real<double> dist_0_1(0,1); //set the distribution to 0-1 
    boost::variate_generator< boost::mt19937&, boost::uniform_real<double> > rand01(rgenerator, dist_0_1);//tell it to use the above two objects 
} 

하지만 헤더에 있기 때문에이 작동하지 않습니다. 나는 어떻게 든 MyObject의 생성자를 사용하여 여러 가지 하위 객체 (배포자, 생성자)의 생성자를 호출 할 수 있다고 생각했지만 방법을 파악할 수 없습니다. MyObject의 생성자가 호출 될 때까지 하위 객체의 기본값 생성자가 이미 호출되었으며 이러한 속성을 재설정하는 멤버 메소드가 있다는 것을 알지 못했습니다 ... 게다가 내가 혼란스러워하는 지점이 아닙니다. 이제는 너무 많은 일이 벌어지고 있습니다. m 혼란 문제,하지만 지금까지 내가 말할 수있는, 내 문제는이 다음, 유치 예에 감소 :

Class Tree { 

    Tree(); 
    Tree(int); 

    protected: 

     fruit apples(int); 
} 

Tree::Tree() { 
    apples(0); //won't work because we can't call the constructor again? 
} 

Tree::Tree(int fruit_num) { 
    apples(fruit_num); //won't work because we can't call the constructor again? 
} 

Class Fruit { 

    public: 
     Fruit(); 
     Fruit(int); 

    protected: 
     int number_of_fruit; 

} 

Fruit::Fruit() { 

    number_of_fruit = 0; 
} 

Fruit::Fruit(int number) { 

    number_of_fruit = number; 

} 

나는이 다른 밖에 모든 사람들에게 제 2의 천성 확신 해요,하지만 난이를 찾을 수 없습니다 개체의 멤버 개체를 기본값이 아닌 생성자 값으로 초기화하는 최상의 방법에 대해 설명하는 문서입니다.

답변

6

원하는 것은 초기화 프로그램 목록입니다. 예를 들어 :

Tree::Tree(int fruit_num) 
    : apples(fruit_num) // Initializes "apple" with "fruit_num" 
{ 
} 

당신은 단순히 생성자 매개 변수 후 여는 중괄호 { 전에 콜론 (:)를 추가합니다. 다른 멤버 생성자는 쉼표 (,)로 구분할 수 있습니다. 예 :

Tree::Tree(int fruit1, int fruit2) : apples(fruit1), bananas(fruit2) { 
} 
+2

+1 다른 가능성을 설명합니다. 완전성을 위해 기본 클래스의 이름 (기본값이 아닌 기본 클래스 생성자 사용)이나 (C++ 11에서는) 현재 클래스의 이름 (생성자 위임 사용)을 지정할 수도 있습니다. –

+1

Initializer 목록을 제안 해 주신 모든 분들께 감사드립니다. 그것이 문제였습니다. 나는 그들이 사용 된 것을 보았지만, 단지 사소한 ... 그래서 나는 그들의 실제 사용을 결코 포착하지 않았다! 그들은 문제를 해결했습니다! – Avacar

2

이 질문에 대한 답은 비교적 간단합니다. 초기화 목록을 사용합니다. 여기

은 예입니다 :

class MyClass { 
private: 
    SomeOtherType sot; 
public: 
    MyClass() : sot(parametersForConstructorOfSOT) {} 
}; 
당신은 물론 여러 구성원 개체,이를 확장 할 수 있습니다

; 부모 클래스의 생성자를 호출하여 부모 클래스의 private 항목을 초기화하는 등의 작업을 수행해야하는 경우에도 사용할 수 있습니다.

2

너무 가까이 있습니다! 이니셜 라이저 목록 구문을 사용하십시오.

Tree::Tree() : apples(0) { 
    // ... 
} 

Tree::Tree(int fruit_num) : apples(fruit_num) { 
    // ... 
} 
관련 문제