读书人

种的成员函数可不可以是递归函数?好纠

发布时间: 2013-01-21 10:15:38 作者: rapoo

类的成员函数可不可以是递归函数?好纠结
比如我要写一个二叉树的类
遍历二叉树 第一个处理根结点,后处理孩子结点 。如果用递归的话,必须传入指针,第一次传入的是指向根结点的指针,以后传入的是指向孩子结点的指针。不好递归啊
void BiTree::PrintBiTree()
{
pBiTNode p=root; //第一个根结点不好传入,我只能为它另写一个函数了
if(p)Print(p);
}
void BiTree::Print(pBiTNode p) //如果没有上面那个函数,第一次就要传入root指针,而root是类的成员
{ //对用户是不可见的。
if(p!=NULL)cout<<p->data;
if(p->lchild!=NULL||p->rchild!=NULL)
{
cout<<'(';
Print(p->lchild);
cout<<',';
Print(p->rchild);
cout<<')';
}
}

可是如果类中有很多递归成员函数的话,每个递归都要写两个函数,就很麻烦了。而且每个递归都两个函数,用户在调用的时候且不容易弄混淆
[解决办法]
root变量的确是成员,而且一般设成私有变量,你可以定义一个共有函数返回该变量啊:


class AAA {
private:
T root;
public:
const T &getRoot() const { // 保护root不被修改
return root;
}

void Print(const T *p) { // 类的递归函数
if (..)
Print(p->left),...,Print(p->right);
}
}

然后调用 AAA::Print(&AAA::getRoot()) 不就行了吗?
[解决办法]
是我没明白你的意思,还是你没明白我的意思呢?

引用:
root变量的确是成员,而且一般设成私有变量,你可以定义一个共有函数返回该变量啊:


class AAA {
private:
T root;
public:
const T &getRoot() const { // 保护root不被修改
return root;
}

void Print(const T *p)……

[解决办法]
引用:
引用:
当然可以的。

你说什么可以?


当然可以递归了
对于你的这个具体的例子 要是我写的话 我就写成
void BiTree::Print(pBiTNode p=NULL)
如果不传参数或者是NULL的时候 就是遍历整个树。
[解决办法]
引用:
这是一个解决方法。但是这样,就是希望用户用的时候应该认为这是一个无参数函数,可是VC6.0的自动提示会告诉它这个函数有参数,不过这个参数有默认值NULL


引用:
引用:
引用:
当然可以的。

你说什么可以?


当然可以递归了
对于你的这个具体的例子 要是我写的话 我就写成……


你看一下MFC的CTREECTRL这个类 里面定义了一些宏 对于操作树结构比较方便
[解决办法]
可以递归

读书人网 >C++

热点推荐