Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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++_Oop_Destructor - Fatal编程技术网

C++ 对象层次结构中的对象删除责任

C++ 对象层次结构中的对象删除责任,c++,oop,destructor,C++,Oop,Destructor,我有三种类型的对象:T、X和Y X在堆上创建T类型的对象,该对象由类X的私有成员指针指向 Y在堆上创建X类型的对象,但需要操作由堆对象X创建的堆对象T Y可以使用私有成员指针来存储指向堆对象X的堆对象T的指针副本 或者Y可以使用本地指针来存储指向堆对象X的堆对象T的指针副本 要清理对象,我可以考虑以下两种方法 方法1 Y在其析构函数中删除X X在其析构函数中删除T 方法2 Y在其析构函数中删除X Y通过析构函数中的成员指针删除X.T 或者Y通过使用X.T的本地函数内的本地指针删除X

我有三种类型的对象:T、X和Y

  • X在堆上创建T类型的对象,该对象由类X的私有成员指针指向
  • Y在堆上创建X类型的对象,但需要操作由堆对象X创建的堆对象T
    • Y可以使用私有成员指针来存储指向堆对象X的堆对象T的指针副本
    • 或者Y可以使用本地指针来存储指向堆对象X的堆对象T的指针副本
要清理对象,我可以考虑以下两种方法

方法1

  • Y在其析构函数中删除X
  • X在其析构函数中删除T
方法2

  • Y在其析构函数中删除X
  • Y通过析构函数中的成员指针删除X.T
  • 或者Y通过使用X.T的本地函数内的本地指针删除X.T

以上两种方法中哪一种是删除对象的首选方法?

方法1听起来更可取。如果类型X分配了一个类型T成员,则该T的删除绝对应该发生在类型X的析构函数中。否则,使用方法2,如果您决定创建一个具有类型X成员的新类型,则必须记住在新构造函数中删除类型T。这可能导致内存泄漏和难以维护的代码


另外,如果Y需要操纵T,那么它应该通过X类型的成员函数来操纵T,因为T是X的私有成员。这样,Y类型就不需要自己指向T类型对象的指针

方法1听起来更可取。如果类型X分配了一个类型T成员,则该T的删除绝对应该发生在类型X的析构函数中。否则,使用方法2,如果您决定创建一个具有类型X成员的新类型,则必须记住在新构造函数中删除类型T。这可能导致内存泄漏和难以维护的代码


另外,如果Y需要操纵T,那么它应该通过X类型的成员函数来操纵T,因为T是X的私有成员。这样,Y类型就不需要自己指向T类型对象的指针

每件事都必须按自己的任务进行


在您的情况下,Y调用X析构函数,X销毁自己的资源。

每件事情都必须在自己的任务中工作


在您的情况下,Y调用X析构函数,X销毁它自己的资源。

似乎是纯粹的封装,
Y
需要直接访问
T
。为什么不在
X
中提供所需的功能,并让
T
成为一个实现细节。我同意两个回答都说使用方法1。但是你可以通过使用std::shared_ptr完全避免这个问题。@MobyDisk:我不想使用shared_ptr,因为我以后会在GPU上运行我的代码(不支持C++11)@pmr:我同意。chmod_007也说了同样的话。另一个假设问题是“假设Y只需要读取X.T,而不需要操纵X.T怎么办”。在这种情况下,您的建议会是相同的吗?@nurabha那么我认为
X
应该提供一个访问器成员函数,该函数只提供对const
const T&get\T()const的引用
Y
需要直接访问
T
的纯封装。为什么不在
X
中提供所需的功能,并让
T
成为一个实现细节。我同意两个回答都说使用方法1。但是你可以通过使用std::shared_ptr完全避免这个问题。@MobyDisk:我不想使用shared_ptr,因为我以后会在GPU上运行我的代码(不支持C++11)@pmr:我同意。chmod_007也说了同样的话。另一个假设问题是“假设Y只需要读取X.T,而不需要操纵X.T怎么办”。在这种情况下,您的建议会是相同的吗?@nurabha那么我认为
X
应该提供一个访问器成员函数,该函数只提供对const
const T&get\T()const的引用。您的上一个语句很有意义。您的上一个语句很有意义。