猿问

请问关于c++类实现的问题 一个函数重复两次,可不可以只出现一次?

很多函数都出现了两次,以destory为例,想只出现一次应该怎么改
#include <iomanip>
#include <iostream>
using namespace std;

template <class T>
class LeftistNode{//左式堆 
public:
T key; // 关键字(键值)
int npl; // 零路经长度(Null Path Length)
LeftistNode *left; // 左孩子
LeftistNode *right; // 右孩子
LeftistNode(T value, LeftistNode *l, LeftistNode *r):
key(value), npl(0), left(l),right(r) {}
};

template <class T>
class LeftistHeap {
private:
LeftistNode<T> *mRoot; // 根结点
void destroy(LeftistNode<T>* &heap);
public:
LeftistHeap();//...
~LeftistHeap();//...
void destory();
//...

template <class T>
void LeftistHeap<T>::destroy(LeftistNode<T>* &heap)
{
if (heap==NULL)
return ;

if (heap->left != NULL)
destroy(heap->left);
if (heap->right != NULL)
destroy(heap->right);

delete heap;
}

template <class T>
void LeftistHeap<T>::destroy()
{
destroy(mRoot);
}

MMMHUHU
浏览 243回答 2
2回答

翻翻过去那场雪

不是很明白“函数出现两次”的意思,以下就实现说下看法:template <class T> class LeftistHeap中:(1)void destroy(LeftistNode<T>* &heap)是其私有函数,因为该类的使用者不应该持有LeftistNode<T>*指针;(2)template <class T> void LeftistHeap<T>::destroy()是其公有函数,如果没有void destroy(LeftistNode<T>* &heap),其中的所有实现都需要在这个公有函数中出现。如果还需要删除其他节点而不只是根节点,那么这些实现代码又得再写一遍。减少重复代码,是void destroy(LeftistNode<T>* &heap)存在的意义。(3)void destroy(LeftistNode<T>* &heap)采用递归方式实现,使得代码最简,如果不用递归,我所想到的方式是用循环。如此就会增加很多代码,因为需要确定一个节点左右孩子节点指针都为NULL时,才能删除该节点。这样就需要保存从根节点到可以删除的第一个节点之间的所有节点,然后逆向逐一删除。

扬帆大鱼

这个叫函数重载,可以一个函数实现,也就是不用重载,也能实现代码功能。函数重载的目的是为了使用方便和不同的处理方式,函数重载调用时是根据实参的数据类型调用对应形参的函数。
随时随地看视频慕课网APP
我要回答