C ++向量复制适用于一个向量,但不适用于另一个向量

时间:2014-05-13 01:40:33

标签: c++ vector

这个问题真的很奇怪,我似乎找不到任何导致它的东西。

所以这里是赋值运算符重载函数,鸟类和哺乳动物是向量。 (以下是课程)

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;
}

也许我太累了,无法找到我犯的错误。请告诉我我做错了什么。

2 个答案:

答案 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;
}