递归函数返回引用

时间:2018-10-14 18:08:30

标签: c++ recursion tree-traversal

我想问一下我正在编写的递归函数,但我认为我对指针,引用和对象本身的概念不太了解。

此函数从标准输入读取树序列,并且应返回整个树。首先是节点值,其次是子节点数。这就是为什么我希望它具有递归性:使用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;
};

1 个答案:

答案 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;
}