2012-07-17 3 views
-1

MAIN.CPP :는 부모 클래스의 생성자가 호출되도록

options my_options; 
tree my_trees; 
CODON_alphabet my_alphabet(1); 
likelihood_engine my_likelihood(&my_options, &my_trees, &my_sites); 
CODON_M0 m0(&my_trees, &my_alphabet, &my_likelihood); 

CODON_alphabet 부모 클래스 알파벳으로이 클래스입니다. 어떤 이유로 CODON_M0 객체를 만들면 알파벳과 CODON_alphabet 클래스의 생성자가 각각 두 번 호출됩니다. 이것은 CODON_M0 생성자의 첫 번째 행이 적중되기 전에 발생합니다. 누가 이런 일이 일어나고 있는지 파악할 수있는 올바른 방향을 알려줄 수 있습니까? 중요한 정보가 누락되면 알려주십시오. 감사.

편집 : 죄송합니다. 여기있는 모든 사람이 내 마음을 읽을 수 있다고 생각했습니다. 가능한 한 작게 줄인 코드가 있지만 원치 않는 생성자가 여전히 호출됩니다.

class CODON_M0: public CODON_model 
{ 
    public: 
    CODON_M0(tree* tree_ptr, CODON_alphabet* alpha_ptr, likelihood_engine* like_ptr) 
} 

class CODON_model: public model 
{ 
    public: 
    CODON_alphabet* my_alphabet; 
    CODON_model(tree* tree_ptr, CODON_alphabet* alpha_ptr, likelihood_engine* like_ptr) 
} 

class model 
{ 
    public: 
    model() {} 
} 

class CODON_alphabet: public alphabet 
{ 
    public: 
    CODON_alphabet() 
    { 
     cout << "\n\n\n *** CODON_alphabet constructor called. *** \n\n\n"; 
    } 
} 

class alphabet 
{ 
    public: 
    alphabet() 
    { 
     cout << "\n\n\n *** alphabet constuctor called. *** \n\n\n"; 
    } 
} 

나는 GDB의 코드를 단계별로 그리고 난 생성자에 CODON_M0 객체와 단계를 생성 선을 쳤을 때, 나는 알파벳과 CODON_alphabet 생성자가 두 번 호출 된 메시지를 참조하십시오. 왜?

+4

"CODON_M0"에 대한 코드가 없어도 적어도 추측 할 수 있습니다. 이상적으로, [최소 테스트 케이스] (http://sscce.org)를 게시하십시오. –

답변

1

CODON_M0CODON_alphabet 유형의 데이터 멤버가 두 개있는 경우 생성자가 들어가기 전에 초기화되므로 생성자가 호출됩니다.

+0

감사합니다 루치 안. 위의 정보를 추가했습니다. CODON_model에는 CODON_alphabet * 유형의 데이터 멤버가 하나 있습니다. – jrm

관련 문제