c – 头文件之间的循环依赖性

发布时间:2020-09-18 发布网站:编程之家
编程之家收集整理的这篇文章主要介绍了c – 头文件之间的循环依赖性编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用两个类实现树状结构:树和节点.问题是,从每个类我想调用另一个类的函数,所以简单的前向声明是不够的.

我们来看一个例子:

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();

这只是一个简单的例子来说明问题.所以我想要的是从Node对象调用Tree的函数.

更新#1:感谢您的回答.我尝试像在Java中一样解决问题,即每个类只使用一个文件.看来我必须开始分离.cpp和.h文件……

更新#2:下面,根据提示,我也粘贴了完整的解决方案.谢谢,问题解决了.

解决方法

在标题中,forward声明成员函数:

class Node
{
    Tree * tree_;
    int id_;

public:
    Node(Tree * tree,int id);
    ~Node();
    void hi();
};

在包含所有必需标头的单独.cpp文件中,定义它们:

#include "Tree.h"
#include "Node.h"

Node::Node(Tree * tree,id_(id)
{
  tree_->incCnt();
}

Node::~Node() 
{
  tree_->decCnt();
}

etc

这也可以保持标题的可读性,因此很容易看到类的界面一目了然.

总结

以上是编程之家为你收集整理的c – 头文件之间的循环依赖性全部内容,希望文章能够帮你解决c – 头文件之间的循环依赖性所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢交流学习经验,点击链接加入编程之家官方QQ群:1065694478
编程之家官方公众号

微信公众号搜索 “ 程序精选 ” ,选择关注!

微信公众号搜索 “ 程序精选 ”
精选程序员所需精品干货内容!