Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用;“零规则”;当我有多态性的指针时_C++_Class_Polymorphism_Copy Constructor - Fatal编程技术网

C++ 使用;“零规则”;当我有多态性的指针时

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

对于“零规则”,我理解我想将数据管理分离为实现规则3、规则5等的简单类,以便更复杂的类可以使用自动提供的构造函数、赋值运算符等

由于多态性,类成员必须是指针时,这是如何工作的

例如,假设我有一节课

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);
   }