gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:19:42 24 4
gpt4 key购买 nike

我的学校作业有问题。我应该创建一个系统来跟踪体育赛事中的竞争者。我有一个基类竞争者和两个派生自名为 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);
}

最佳答案

我明白 contenders是指向指针数组的指针。

存在三个问题:

  • 你需要初始化contenders .
  • dynamic_cast<>检查应使用原始对象
  • ProfessionalExerciser复制构造函数当然被定义为复制 Professional 类型的对象和 Exerciser分别而不是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<> 的一个非常好的和强大的替代方法。检查

关于c++ - 使用继承时的复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28196676/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com