-1

主.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 类的构造函数都被调用了两次。这发生在 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

1 回答 1

1

如果CODON_M0有两个类型的数据成员CODON_alphabet,它们将在构造函数进入之前被初始化,因此构造函数被调用。

于 2012-07-17T19:02:50.750 回答