我在这里有这个代码:
class DerivedClass : public BaseClass {
SomeClass* a1;
Someclass* a2;
public:
//constructors go here
~DerivedClass() { delete a1; delete a2;}
// other functions go here ....
};
我的第一个问题如下:
我的第二个问题是:
答案 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
是合适的)。