【发布时间】:2015-03-27 14:44:15
【问题描述】:
我的学校作业有问题。我应该创建一个系统来跟踪体育赛事中的竞争者。我有一个基类竞争者和两个派生自 Professional 和 Exerciser 的类。
然后我有一个包含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);
}
【问题讨论】:
-
那么您对这段代码有什么问题?您可能想查看virtual constructor idiom(尤其是虚拟副本)。
-
但是
Register类需要知道所有可能的派生类。或许你可以给基类一个virtual Base* clone() const;成员函数,所有派生类都实现为Base* clone() const { return new Derived (*this); } -
this->contenders是什么类型?根据类型,您可能有未定义的行为。 (它应该是一个向量。) -
它告诉我“没有与参数列表参数类型匹配的构造函数 Professional::Professional 的实例是:(Contender)”。我们不应该在这个作业中使用向量,如果你愿意,我可以发布所有代码
标签: c++ inheritance copy-constructor deep-copy