C++ 使用;“零规则”;当我有多态性的指针时
对于“零规则”,我理解我想将数据管理分离为实现规则3、规则5等的简单类,以便更复杂的类可以使用自动提供的构造函数、赋值运算符等 由于多态性,类成员必须是指针时,这是如何工作的 例如,假设我有一节课C++ 使用;“零规则”;当我有多态性的指针时,c++,class,polymorphism,copy-constructor,C++,Class,Polymorphism,Copy Constructor,对于“零规则”,我理解我想将数据管理分离为实现规则3、规则5等的简单类,以便更复杂的类可以使用自动提供的构造函数、赋值运算符等 由于多态性,类成员必须是指针时,这是如何工作的 例如,假设我有一节课 class MyClass{ private: s_array<int> mynumbers; s_array<double> mydoubles; Base * object; ... }; class-MyClass{ 私人: s_数组; s_数组mydoub
class MyClass{
private:
s_array<int> mynumbers;
s_array<double> mydoubles;
Base * object;
...
};
class-MyClass{
私人:
s_数组;
s_数组mydouble;
基本*对象;
...
};
这里,Base
是具有多个派生类的基类,object
可以指向其中一个派生类。因此,object
是获取多态性的指针
如果没有这个
Base
指针,我可以使用MyClass
的零规则,假设s_数组
正确实现。有没有一种方法可以设置东西,使MyClass
可以使用零规则,即使对象是指针?我希望复制的行为是,MyClass
的新实例获取指向对象的新副本的指针。如果要对指针应用0规则,则需要使用共享指针:
shared_ptr<Base> object;
共享的ptr对象;
然而,这并不能完全满足您的要求。因为shared_ptr
将提供5的规则,但复制的指针将始终指向同一原始对象
要获得所需的行为,您需要创建自己的智能指针,以提供规则3或5 如果要对指针应用0规则,则需要使用共享指针:
shared_ptr<Base> object;
共享的ptr对象;
然而,这并不能完全满足您的要求。因为shared_ptr
将提供5的规则,但复制的指针将始终指向同一原始对象
要获得所需的行为,您需要创建自己的智能指针,以提供规则3或5 如果多个MyClass
对象可以指向相同的Base
对象,那么只需使用std::shared_ptr
而不是Base*
作为您的对象
成员,如其他响应者所述
但是,如果每个MyClass
对象需要指向自己的Base
对象,那么您别无选择,只能在MyClass
中实现3/5规则,以便它可以创建自己的Base
对象和/或从另一个MyClass
对象克隆Base
对象 如果多个MyClass
对象可以指向相同的Base
对象,那么只需使用std::shared_ptr
而不是Base*
作为您的对象
成员,如其他响应者所述
但是,如果每个MyClass
对象需要指向自己的Base
对象,那么您别无选择,只能在MyClass
中实现3/5规则,以便它可以创建自己的Base
对象和/或从另一个MyClass
对象克隆Base
对象 为了记录在案,我用来解决这个问题的方法如下(基本上如上文所述):
为了记录在案,我用来解决这个问题的方法如下(基本上如上文所述):
使用具有所需行为的智能指针类,而不是非托管原始指针。std::shared_ptr对象
是最简单的方法。如果您的类管理资源,则不可能应用零规则。但如上所述,您可以将此负担转移到智能指针上,您的类将不需要管理任何内容。如果您坚持认为MyClass
包含指向托管资源的指针,则MyClass
无法遵守零规则。对象的管理需要降级到另一个类,该类根据需要遵循3或5的规则(例如,复制构造函数,用于处理所需的指向对象克隆)。然后,您的MyClass
可以从该管理器类继承,也可以将该管理器类的一个(或多个)实例作为成员,而不是将object
作为指针。使用具有所需行为的智能指针类,而不是非托管原始指针。std::shared_ptr object
是最简单的方法。如果您的类管理资源,则不可能应用零规则。但如上所述,您可以将此负担转移到智能指针上,您的类将不需要管理任何内容。如果您坚持认为MyClass
包含指向托管资源的指针,则MyClass
无法遵守零规则。对象的管理需要降级到另一个类,该类根据需要遵循3或5的规则(例如,复制构造函数,用于处理所需的指向对象克隆)。然后您的MyClass
可以从该管理器类继承,或者将该管理器类的一个(或多个)实例作为成员,而不是将对象作为指针。
class myClass : public parentClass{
...
public:
myClass* Clone()
{
return new myClass(*this);
}