使用继承时的复制构造函数

时间:2015-01-28 15:55:06

标签: c++ inheritance copy-constructor deep-copy

我的学校作业有问题。我应该创建一个系统来跟踪体育赛事中的竞争者。我有一个基类竞争者和两个派生自ProfessionalExerciser的类。 然后我有一个包含Contender **contenders的注册类。我必须为这个类创建一个复制构造函数,但我不知道该怎么做。

我想过这样的事情

Register::Register(const Register& original)
{
    this->kap = original.kap;
    this->currentAmount = original.currentAmount;
    for (int i = 0; i < this->currentAmount; i++)
    {
        if (Professional* pro = dynamic_cast<Professional*>(this->contenders[i]))
        {
            this->contenders[i] = new Professional(*original.contenders[i]);
        }
        if (Exerciser* pro = dynamic_cast<Exerciser*>(this->contenders[i]))
        {
            this->contenders[i] = new Exerciser(*original.contenders[i]);
        }
    }
    this->initiate(this->currentAmount);
}

1 个答案:

答案 0 :(得分:1)

我知道contenders是一个指针数组的指针。

有三个问题:

  • 您需要初始化contenders
  • dynamic_cast<>检查应使用原始对象
  • ProfessionalExerciser副本构造函数肯定被定义为分别复制ProfessionalExerciser类型的对象,而不是Contender

这是一个建议的修正:

Register::Register(const Register& original)
{
    kap = original.kap;
    currentAmount = original.currentAmount;
    contenders = new Contender[currentAmount];  // was missing
    for (int i = 0; i < currentAmount; i++)
    {
        if (Professional* pro = dynamic_cast<Professional*>(original.contenders[i]))
        {
            contenders[i] = new Professional(*pro);  // use the pro instead of contender
        }
        if (Exerciser* exe = dynamic_cast<Exerciser*>(original.contenders[i]))  
        {
            contenders[i] = new Exerciser(*exe);  // use exe instead of contender
        }
    }
    initiate(currentAmount);
}

但有三个建议:

  • 您不需要使用this->作为所有对象变量的前缀。仅在成员函数本身的局部变量不明确的情况下。
  • 想到使用vector而不是指向数组的指针
  • 评论中提出的克隆方法对于dynamic_cast<>检查来说是一个非常好的和强大的替代方案