我应该如何在 C++ 中为节点 class 定义析构函数?
How should I define my destructor for the Node class in C++?
我应该为由静态节点组成的树实现 class 个节点(出于教育目的)。 classes headers 看起来像这样:
class CNodeStatic
{
private:
int i_val;
CNodeStatic *pc_parent_node;
vector<CNodeStatic> v_children;
public:
CNodeStatic() {i_val =0; pc_parent_node = NULL;};
~CNodeStatic();
void vSetValue(int iNewVal) {i_val = iNewVal;};
int iGetChildrenNumber() {return (v_children.size());};
void vAddNewChild();
void vAddChild(CNodeStatic pcChildNode);
CNodeStatic *pcGetChild (int iChildOffset);
};
class CTreeStatic
{
private:
CNodeStatic c_root;
public:
CTreeStatic();
~CTreeStatic();
CNodeStatic *pcGetRoot() {return (&c_root);};
bool bMoveSubtree(CNodeStatic *pcParentNode, CNodeStatic *pcNewChildNode);
void vPrintTree();
};
但是我不确定这种 class 的析构函数应该是什么样子。我知道当class中有动态分配的内存或指针时,我们需要定义析构函数。在本例中,pc_parent_node
指向节点的 parent。但是,如果我尝试将我的析构函数仅定义为 delete pc_parent_node
,该程序将无法运行。
I know that we need to define destructors when there is a dynamically allocated memory or pointer in class
没错。如果 class 管理资源,它必须管理资源,清理是其中的一部分。
In this case it's pc_parent_node
that points to the parent of the node.
指针 != 管理资源。特别是,不应使用原始指针来管理生命周期。
显示的代码没有动态分配某些东西。 class 似乎不拥有资源,因此它没有必须在其析构函数中删除的内容。如果它确实管理资源,它应该通过使用智能指针或容器来管理。
了解零规则 (https://en.cppreference.com/w/cpp/language/rule_of_three)。管理资源的 class 应该只做那个而不做别的。在所有其他情况下,您应该通过将生命周期管理委托给智能指针或容器来努力遵循零规则。最好的析构函数是编译器可以生成的析构函数。仅当这还不够时,您才需要手动管理一些东西。
我应该为由静态节点组成的树实现 class 个节点(出于教育目的)。 classes headers 看起来像这样:
class CNodeStatic
{
private:
int i_val;
CNodeStatic *pc_parent_node;
vector<CNodeStatic> v_children;
public:
CNodeStatic() {i_val =0; pc_parent_node = NULL;};
~CNodeStatic();
void vSetValue(int iNewVal) {i_val = iNewVal;};
int iGetChildrenNumber() {return (v_children.size());};
void vAddNewChild();
void vAddChild(CNodeStatic pcChildNode);
CNodeStatic *pcGetChild (int iChildOffset);
};
class CTreeStatic
{
private:
CNodeStatic c_root;
public:
CTreeStatic();
~CTreeStatic();
CNodeStatic *pcGetRoot() {return (&c_root);};
bool bMoveSubtree(CNodeStatic *pcParentNode, CNodeStatic *pcNewChildNode);
void vPrintTree();
};
但是我不确定这种 class 的析构函数应该是什么样子。我知道当class中有动态分配的内存或指针时,我们需要定义析构函数。在本例中,pc_parent_node
指向节点的 parent。但是,如果我尝试将我的析构函数仅定义为 delete pc_parent_node
,该程序将无法运行。
I know that we need to define destructors when there is a dynamically allocated memory or pointer in class
没错。如果 class 管理资源,它必须管理资源,清理是其中的一部分。
In this case it's
pc_parent_node
that points to the parent of the node.
指针 != 管理资源。特别是,不应使用原始指针来管理生命周期。
显示的代码没有动态分配某些东西。 class 似乎不拥有资源,因此它没有必须在其析构函数中删除的内容。如果它确实管理资源,它应该通过使用智能指针或容器来管理。
了解零规则 (https://en.cppreference.com/w/cpp/language/rule_of_three)。管理资源的 class 应该只做那个而不做别的。在所有其他情况下,您应该通过将生命周期管理委托给智能指针或容器来努力遵循零规则。最好的析构函数是编译器可以生成的析构函数。仅当这还不够时,您才需要手动管理一些东西。