我想问一下我正在编写的递归函数,但我认为我对指针,引用和对象本身的概念不太了解。
此函数从标准输入读取树序列,并且应返回整个树。首先是节点值,其次是子节点数。这就是为什么我希望它具有递归性:使用afegir_fill func它将子级连接到节点。
树类(Arbre)已经实现(here HPP file)和递归函数:
Arbre<int> read_arbre() {
int arrel, fills;
cin >> arrel;
cin >> fills;
Arbre<int> root(arrel);
if (fills > 0) {
for(int i = 0; i < fills; i++) {
root.afegir_fill(read_arbre());
}
}
return root;
}
我得到的错误是error: cannot bind non-const lvalue reference of type ‘Arbre<int>&’ to an rvalue of type ‘Arbre<int>’.
,那么我是否需要每次都返回对树的引用?怎么样?
arbre.hpp
#include <iostream>
#include <cstddef>
using namespace std;
template <typename T>
class Arbre {
private:
Arbre(): _arrel(NULL) {};
struct node {
T info;
node* primf;
node* seggerm;
};
node* _arrel;
static node* copia_arbre(node* p);
static void destrueix_arbre(node* p) throw();
public:
// Constructs an Arbre with a x as unique node.
Arbre(const T &x);
// Rule of three.
Arbre(const Arbre<T> &a);
Arbre& operator=(const Arbre<T> &a);
~Arbre() throw();
// b.afegir_fill(a) a tree becomes first child of b tree, and after that a becomes invalid.
void afegir_fill(Arbre<T> &a);
friend class iterador;
class iterador {
public:
friend class Arbre;
// Invalid iterator.
iterador() throw();
// Returns the sub-tree
Arbre<T> arbre() const;
// Returns the value.
T operator*() const;
// Returns first child.
iterador primogenit() const;
// Returns next brother.
iterador seg_germa() const;
// Operators.
bool operator==(const iterador &it) const {
return _p == it._p;
};
bool operator!=(const iterador &it) const {
return _p != it._p;
};
static const int IteradorInvalid = 410;
private:
Arbre<T>::node* _p;
};
// Returns iterator to root.
iterador arrel() const throw();
// Returns invalid iterator.
iterador final() const throw();
static const int ArbreInvalid = 400;
};
答案 0 :(得分:0)
最终解决了,只是存储返回的对象,然后再次调用该函数。
Arbre<int> read_arbre() {
int arrel, fills;
cin >> arrel;
cin >> fills;
Arbre<int> root(arrel);
if (fills > 0) {
for(int i = 0; i < fills; i++)
{
Arbre<int> fill = read_arbre();
root.afegir_fill(fill);
}
}
return root;
}