当我有多态指针时使用 "rule of zero"
Using "rule of zero" when I have pointers for polymorphism
对于 "rule of zero",我明白我想将数据管理分成简单的 classes 实施规则 3,规则 5,等等,这样越复杂 classes 可以使用自动提供的构造函数、赋值运算符等。
当 class 成员由于多态性而必须是指针时,这是如何工作的?
例如,假设我有一个 class
class MyClass{
private:
s_array<int> mynumbers;
s_array<double> mydoubles;
Base * object;
...
};
这里,Base
是一个基class,有多个派生classes,object
可能指向其中一个派生classes .所以object
是一个指针,为了得到多态性
如果不是因为 Base
指针的存在,假设 s_array<>
已正确实施,我可以对 MyClass
使用零规则。有没有一种方法可以让 MyClass
可以使用零规则,即使对象是一个指针?我想要复制的行为是 MyClass
的新实例获取指向 object
.
的新副本的指针
如果你想用指针应用0规则,你需要使用共享指针:
shared_ptr<Base> object;
但这并不能完全满足您的要求。因为 shared_ptr
将提供规则 5,但复制的指针将始终指向同一个原始对象。
要获得所需的行为,您需要创建自己的智能指针以提供 3 或 5 的规则。
如果多个 MyClass
对象可以指向同一个 Base
对象,那么只需使用 std::shared_ptr<Base>
而不是 Base*
作为您的 object
成员,因为提到了其他响应者。
但是,如果每个 MyClass
对象都需要指向它自己的 Base
对象,那么您别无选择,只能在 MyClass
中实施 3/5 规则,以便它可以创建自己的 Base
对象 and/or 从另一个 MyClass
对象克隆一个 Base
对象。
记录一下,我解决这个问题的方法如下(基本上按照上面的建议):
template <class myClass>
class clone_ptr
{
public:
clone_ptr(){location=nullptr;}
clone_ptr(myClass* d) { location = d;}
~clone_ptr() { delete location; }
clone_ptr(const clone_ptr<myClass>& source){
if (source.location!=nullptr){
location=source.location->Clone();
}
else
location=nullptr;
}
clone_ptr& operator= (const clone_ptr<myClass>& source){
if (&source!=this){
if (source.location!=nullptr){
location=source.location->Clone();
}
else
location=nullptr;
}
return *this;
}
myClass* operator->() { return location; }
myClass& operator*() { return *location; }
private:
myClass* location;
};
我在适当的 类 中实现了 Clone() 函数,如下所示:
class myClass : public parentClass{
...
public:
myClass* Clone()
{
return new myClass(*this);
}
对于 "rule of zero",我明白我想将数据管理分成简单的 classes 实施规则 3,规则 5,等等,这样越复杂 classes 可以使用自动提供的构造函数、赋值运算符等。
当 class 成员由于多态性而必须是指针时,这是如何工作的?
例如,假设我有一个 class
class MyClass{
private:
s_array<int> mynumbers;
s_array<double> mydoubles;
Base * object;
...
};
这里,Base
是一个基class,有多个派生classes,object
可能指向其中一个派生classes .所以object
是一个指针,为了得到多态性
如果不是因为 Base
指针的存在,假设 s_array<>
已正确实施,我可以对 MyClass
使用零规则。有没有一种方法可以让 MyClass
可以使用零规则,即使对象是一个指针?我想要复制的行为是 MyClass
的新实例获取指向 object
.
如果你想用指针应用0规则,你需要使用共享指针:
shared_ptr<Base> object;
但这并不能完全满足您的要求。因为 shared_ptr
将提供规则 5,但复制的指针将始终指向同一个原始对象。
要获得所需的行为,您需要创建自己的智能指针以提供 3 或 5 的规则。
如果多个 MyClass
对象可以指向同一个 Base
对象,那么只需使用 std::shared_ptr<Base>
而不是 Base*
作为您的 object
成员,因为提到了其他响应者。
但是,如果每个 MyClass
对象都需要指向它自己的 Base
对象,那么您别无选择,只能在 MyClass
中实施 3/5 规则,以便它可以创建自己的 Base
对象 and/or 从另一个 MyClass
对象克隆一个 Base
对象。
记录一下,我解决这个问题的方法如下(基本上按照上面的建议):
template <class myClass>
class clone_ptr
{
public:
clone_ptr(){location=nullptr;}
clone_ptr(myClass* d) { location = d;}
~clone_ptr() { delete location; }
clone_ptr(const clone_ptr<myClass>& source){
if (source.location!=nullptr){
location=source.location->Clone();
}
else
location=nullptr;
}
clone_ptr& operator= (const clone_ptr<myClass>& source){
if (&source!=this){
if (source.location!=nullptr){
location=source.location->Clone();
}
else
location=nullptr;
}
return *this;
}
myClass* operator->() { return location; }
myClass& operator*() { return *location; }
private:
myClass* location;
};
我在适当的 类 中实现了 Clone() 函数,如下所示:
class myClass : public parentClass{
...
public:
myClass* Clone()
{
return new myClass(*this);
}