Zyklische Abhängigkeit zwischen Header-Dateien

Ich versuche, eine baumartige Struktur mit zwei Klassen zu implementieren:Tree undNode. Das Problem ist, dass ich von jeder Klasse eine Funktion der anderen Klasse aufrufen möchte, sodass einfache Forward-Deklarationen nicht ausreichen.

Sehen wir uns ein Beispiel an:

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 */

Baum aufrufen:

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

Dies ist nur ein einfaches Beispiel, um das Problem zu veranschaulichen. Ich möchte also eine Funktion von aufrufenTree von einemNode Objekt.

Update Nr. 1: Danke für die Antworten. Ich habe versucht, das Problem wie in Java zu lösen, d. H. Mit nur einer Datei pro Klasse. Es scheint, dass ich anfangen muss, CPP- und H-Dateien zu trennen ...

Update Nr. 2: Im Folgenden habe ich den Hinweisen folgend auch die vollständige Lösung eingefügt. Danke, Problem gelöst.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage