Циклическая зависимость между заголовочными файлами

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

Давайте посмотрим на пример:

tree.h:

#ifndef TREE_20100118
#define TREE_20100118

#include <vector>
#include "Node.h"

class Tree
{
    int counter_;
    std::vector<Node> nodes_;

public:

    Tree() : counter_(0) {}

    void start() {
        for (int i=0; i<3; ++i) {
            Node node(this, i);
            this->nodes_.push_back(node);
        }
        nodes_[0].hi();    // calling a function of Node
    }

    void incCnt() {
        ++counter_;
    }

    void decCnt() {
        --counter_;
    }

};

#endif /* TREE_20100118 */

node.h:

#ifndef NODE_20100118
#define NODE_20100118

#include <iostream>
//#include "Tree.h"

class Tree;    // compile error without this

class Node
{
    Tree * tree_;
    int id_;

public:

    Node(Tree * tree, int id) : tree_(tree), id_(id)
    {
//      tree_->incCnt();    // trying to call a function of Tree
    }

    ~Node() {
//      tree_->decCnt();    // problem here and in the constructor
    }

    void hi() {
        std::cout << "hi (" << id_ << ")" << endl;
    }

};

#endif /* NODE_20100118 */

Дерево вызовов:

#include "Tree.h"
...
Tree t;
t.start();

Это простой пример, иллюстрирующий проблему. Так что я хочу, чтобы вызвать функциюTree изNode объект.

Обновление № 1: Спасибо за ответы. Я попытался решить эту проблему, как в Java, то есть, используя только один файл на класс. Кажется, мне придется начать разделять файлы .cpp и .h ...

Обновление № 2: Ниже, следуя подсказкам, я также вставил полное решение. Спасибо, проблема решена.

Ответы на вопрос(4)

Ваш ответ на вопрос