这个问题真的很奇怪,我似乎找不到任何导致它的东西。
所以这里是赋值运算符重载函数,鸟类和哺乳动物是向量。 (以下是课程)
const Register& Register::operator=(const Register& theOther)
{
if(this != &theOther)
{
this->~Register(); // deleted
birds.resize(theOther.birds.size());
mammals.resize(theOther.mammals.size());
birds=theOther.birds;
mammals=theOther.mammals;
}
return *this;
}
(如果你发现任何奇怪的东西,那是因为我多次重写这些行)。所以问题是在运行时,
birds.operator =(theOther.birds);
工作得非常好,每个变量都被正确复制,但当它到达下一行时,它会调用与鸟类相同的矢量复制功能,但哺乳动物永远不会其他.mammals -es动物部分(物种等)。它获得了唯一的哺乳动物部分(捕食者等)。我只是不明白。下面是我的课程,正如你所看到的,它们在这里重要的部分是完全相似的......
所以,班级
class Animal
{
char* species;
unsigned int weight;
char* color;
public:
...
}
鸟类
class Bird: public Animal
{
bool singing;
bool waterfowl;
unsigned int eggs;
public:
...
const Bird& operator =(const Bird& theOther);
{
if(this != &theOther)
{
Bird copy(theOther);
this->setSpecies(copy.getSpecies());
this->setWeight(copy.getWeight());
this->setColor(copy.getColor());
singing = theOther.singing;
waterfowl = theOther.waterfowl;
eggs = theOther.eggs;
}
return *this;
}
哺乳动物类
class Mammal: public Animal
{
bool predator;
bool oviparous;
public:
...
const Mammal& Mammal::operator =(const Mammal& theOther)
{
if(this != &theOther)
{
Mammal copy(theOther);
this->setPredator(copy.getPredator());
this->setOviparous(copy.getOviparous());
predator = theOther.predator;
oviparous = theOther.oviparous;
}
return *this;
}
当然还有寄存器,它有矢量。
class Register
{
std::vector <Bird> birds;
std::vector <Mammal> mammals;
std::vector <Reptile> reptiles;
public:
...
编辑:
Register::Register(const Register& newRegister)
{
birds = newRegister.birds;
mammals = newRegister.mammals;
reptiles = newRegister.reptiles;
}
edit2:
void Animal::setSpecies(char* _species)
{
this->species = _species;
}
也许我太累了,无法找到我犯的错误。请告诉我我做错了什么。
答案 0 :(得分:2)
如前所述 - 不要手动调用析构函数。
您的哺乳动物operator=
在您的鸟operator=
做的时候不会复制物种,体重和颜色的原因是哺乳动物版本没有设定这些值的代码。鸟类操作员有以下几行:
this->setSpecies(copy.getSpecies());
this->setWeight(copy.getWeight());
this->setColor(copy.getColor());
哺乳动物操作员没有。
将这些品系复制到哺乳动物操作员中,或者更好的是,编写一种动物方法,并从鸟类和哺乳动物的操作者那里调用它。
我也不确定为什么你需要在致电getSpecies
等之前制作副本,你应该可以在原始theOther
参数上调用它。
答案 1 :(得分:0)
您的代码有未定义的行为。致电this->~Register();
后,您不得访问this
的任何成员。你应该简单地删除那一行,一切都会好的(尽管可能不是例外安全)。
如果您想要强大的异常安全性,您应该使用复制和交换习惯用法来实现operator=
:
const Register& Register::operator=(Register theOther)
{
std::swap(*this, theOther);
return *this;
}
此外,子类中的operator=
应调用超类中的operator=
。您可以通过调用Animal::operator=
手动执行此操作,也可以再次使用copy-and-swap实现强大的异常安全。
Mammal& Mammal::operator=(const Mammal& theOther)
{
if(this != &theOther)
{
static_cast<Animal&>(*this) = theOther; //Call Animal::operator=
predator = theOther.predator;
oviparous = theOther.oviparous;
}
return *this;
}
//Or use:
Mammal& Mammal::operator=(Mammal theOther)
{
std::swap(*this, theOther);
return *this;
}