使用operator =复制构造函数

时间:2013-07-01 15:28:51

标签: c++ constructor operator-overloading

我在这里有这个代码:

class DerivedClass : public BaseClass {
    SomeClass* a1;
    Someclass* a2;
public:
    //constructors go here
    ~DerivedClass() { delete a1; delete a2;}
    // other functions go here ....
};

我的第一个问题如下:

  • 我可以将“operator =”写入“DerivedClass”吗? (如果你的回答是肯定的,你能告诉我怎么做吗?)

我的第二个问题是:

  • 如果上述答案是肯定的,您能否告诉我如何使用您之前编写的“operator =”制作“复制品”(如果可能的话)?

2 个答案:

答案 0 :(得分:1)

copy ctor和op =的主体取决于您计划存储资源的方式:a1和a2变量。如果您需要将它们复制到另一个类 - 您应该编写一些函数来创建SomeClass对象的完整副本。另一种情况 - 你可以简单地复制指针值 - 但是要非常小心你使用它们的方式,特别是删除它们。共享资源问题最简单的解决方案是使用一些智能指针,例如boost :: shared_ptr或c ++ 11 std :: shared_ptr。

因此,如果您打算复制资源:

class DerivedClass : public BaseClass {
    SomeClass* a1;
    Someclass* a2;
public:

    // note: do not forget to assign zeroes to your pointers, unless  you use some kind of smart pointers
    DerivedClass()
    :a1(0), a2(0){}

    DerivedClass(const DerivedClass& d)
                :a1(0), a2(0)
    {
        *this = d;
    }

    DerivedClass& operator=(const DerivedClass& d)
    {
        if (this == &d)
            return *this;

        delete a1;
        a1 = d.a1->clone();

        delete a2;
        a2 = d.a2->clone();

        return *this;
    }


    //constructors go here
    ~DerivedClass() { delete a1; delete a2;}
    // other functions go here ....
};

您还需要SomeClass的clone()函数,它将复制您的对象:     class SomeClass     {     公共:

    SomeClass* clone() const
    {
        return new SomeClass();
    }
};

答案 1 :(得分:1)

这是编写复制构造函数和赋值运算符的最佳方法,尊重“零度规则”:

#include <optional>
class DerivedClass : public BaseClass
{
    std::optional<SomeClass> a1;
    std::optional<SomeClass> a2;
public:
    //constructors go here
};

编译器将为析构函数,复制构造函数和复制赋值运算符编写正确的代码。如果SomeClass是可移动的,您也可以免费获得移动分配和移动构造函数。

如果SomeClass是多态的,则需要像{BOOIt提到的clone()函数。但即使在这种情况下,使用智能指针也很有价值(std::unique_ptr是合适的)。