Я хотел бы спросить о рекурсивной функции, которую я пишу, но я думаю, что я не понимаю концепции указателя, ссылки и самого объекта.
Эта функция читает последовательность дерева из стандартного ввода и должна возвращать все дерево.Сначала идет значение узла, а затем число дочерних узлов.Вот почему я хочу, чтобы он был рекурсивным: с помощью функции afegir_fill он присоединяет дочерний элемент к узлу.
Класс дерева (Arbre) уже реализован ( здесь файл HPP ) и рекурсивныйфункция:
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;
};