2013-07-01 17 views
-1

我有了这个代码在这里:与运营商的拷贝构造函数=

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

我的第一个问题是:

  • 我可以写一个“操作符=”到“DerivedClass”? (如果你的答案是肯定的,你能告诉我怎么样?)

我的第二个问题是:

  • 如果答案以上是肯定的,你能告诉我如何做一个“副本consructor“使用你事先写过的”operator =“(如果甚至可能的话)?
+5

是的,你可以,是的,这是可能的,但如果我们发布代码给你,你将不会学到任何东西。试试你自己并发布你可能遇到的任何问题。 – zennehoy

+0

http://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29 – DGomez

+0

通常的模式是在赋值运算符(复制和交换)中使用复制构造函数,而不是其他方式。在复制构造函数中使用赋值运算符需要构造成员变量,然后才能使用低效的赋值运算符。 – syam

回答

1

副本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()函数,它会复制你的对象: 类SomeClass的 { 市民:

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

您的副本构造函数具有未定义的行为:当a1未初始化时'删除a1'。 – Arkadiy

+0

谢谢你注意并修复这个愚蠢的错误。 – Bogolt

+0

这比直接下调它更好。我认为这个解决方案很好。 –

1

下面是写出复制构造函数和赋值运算符的最佳方式,尊重“零规则”:

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

编译器将为析构函数,复制构造函数和复制赋值运算符编写正确的代码。如果SomeClass是可移动的,那么您将获得移动任务并移动构造函数。

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

+0

哪个标准定义标头''?它似乎不是ISO/IEC 14882:2011(C++ 11标准)。表14和15(p435,并且在[C和C++中的标准头文件列表](http://stackoverflow.com/questions/2027991/)中再现)没有列出''作为头。 –

+0

@Jonathan:oops,[只有在名字空间'std'开始于C++ 14草案](http://en.cppreference.com/w/cpp/utility/optional)。你知道一个好的C++ 11替代方案,就像'std :: unique_ptr',但是可以通过复制目标对象来复制吗? –

+0

简而言之,不 - 我没有看上去很难。也许Boost有一个好的? (版本1.54今天发布,2013-07-01,通过我收到的电子邮件进行判断。) –