Рекурсивная функция, возвращающая ссылку - PullRequest
0 голосов
/ 14 октября 2018

Я хотел бы спросить о рекурсивной функции, которую я пишу, но я думаю, что я не понимаю концепции указателя, ссылки и самого объекта.

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

1 Ответ

0 голосов
/ 15 октября 2018

Окончательно решено, только что сохраненный объект возражал, прежде чем снова вызывать функцию.

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;
}
...