我的解决方案有什么问题?

时间:2013-03-15 11:04:52

标签: c++ operator-overloading assignment-operator

这是我母语的翻译。
你有一个班级:

class Boo : public SuperBoo {
  Foo* fFoo1;
  Foo* fFoo2;
}

Foo - 单形类和Boo拥有指针fFoo1,fFoo2。
为Boo重载赋值运算符。

我的解决方案是:

class Foo
{
public:
    Foo()
    {}
};

class SuperBoo
{
public:
    virtual ~SuperBoo()
    {}
};

class Boo : public SuperBoo
{
public:
    Boo(const int f1_id, const int f2_id)
    {
        f1 = new Foo(f1_id);
        f2 = new Foo(f2_id);
    }
    ~Boo()
    {
        delete f1;
        delete f2;
    }
    /* C++11 only
    Boo(Boo&& other)
    {
        std::swap(*this, other);
    }
    */
    Boo(const Boo& other)
    {
        f1 = new Foo(*(other.f1));
        f2 = new Foo(*(other.f2));
    }
    Boo& operator=(Boo other)
    {
        std::swap(f1, other.f1);
        std::swap(f2, other.f2);
        return *this;
    }
private:
    Foo* f1;
    Foo* f2;
};

但是雇主并不喜欢它。这有什么不对?谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

构造函数可以重写为:

Boo(const int f1_id, const int f2_id)
{
    std::unique_ptr<Foo> pf1 = new Foo(f1_id);
    f2 = new Foo(f2_id);

    f1 = pf1.release();
}

这样,如果f2构造函数抛出,f1将不会被泄露。

顺便说一下,复制构造函数应遵循相同的规则。