我的学校作业有问题。我应该创建一个系统来跟踪体育赛事中的竞争者。我有一个基类竞争者和两个派生自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);
}
答案 0 :(得分:1)
我知道contenders
是一个指针数组的指针。
有三个问题:
contenders
。 dynamic_cast<>
检查应使用原始对象Professional
和Exerciser
副本构造函数肯定被定义为分别复制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<>
检查来说是一个非常好的和强大的替代方案