-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オブジェクトを作成すると、何らかの理由で、クラスalphabetとCODON_alphabetのコンストラクターがそれぞれ2回呼び出されます。これは、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オブジェクトを作成する行に到達してコンストラクターにステップインすると、alphabetコンストラクターとCODON_alphabetコンストラクターが2回呼び出されたというメッセージが表示されます。なんで?

4

1 に答える 1

1

CODON_M0type の 2 つのデータ メンバがある場合CODON_alphabet、それらはコンストラクタが入る前に初期化されるため、コンストラクタが呼び出されます。

于 2012-07-17T19:02:50.750 に答える