为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

MMMHUHU 2021-12-15 11:07:47
很多函数都出现了两次,以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);}
查看完整描述

2 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

不是很明白“函数出现两次”的意思,以下就实现说下看法:
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时,才能删除该节点。这样就需要保存从根节点到可以删除的第一个节点之间的所有节点,然后逆向逐一删除。

查看完整回答
反对 回复 2021-12-19
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

这个叫函数重载,可以一个函数实现,也就是不用重载,也能实现代码功能。
函数重载的目的是为了使用方便和不同的处理方式,函数重载调用时是根据实参的数据类型调用对应形参的函数。

查看完整回答
反对 回复 2021-12-19
  • 2 回答
  • 0 关注
  • 242 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号