C+中的循环指针+; < >我在C++中实现后缀TIE结构,其中使用三个类, TIE < /C>,节点< /C> >和 Edg/。由于我使用的是类,所以我将函数/变量声明分为头文件(.hpp)和它们在各自的.cpp文件中的实现。现在我不习惯这样做(我通常将所有内容都写在一个.cpp文件中),但我认为这对可读性和结构都有好处
因此,我有以下文件:C+中的循环指针+; < >我在C++中实现后缀TIE结构,其中使用三个类, TIE < /C>,节点< /C> >和 Edg/。由于我使用的是类,所以我将函数/变量声明分为头文件(.hpp)和它们在各自的.cpp文件中的实现。现在我不习惯这样做(我通常将所有内容都写在一个.cpp文件中),但我认为这对可读性和结构都有好处,c++,pointers,object,C++,Pointers,Object,因此,我有以下文件: Launcher.cpp,包含main()函数 Trie.hpp,包含函数和变量的声明 Trie.cpp,包含Trie.hpp中声明的函数的实现 Node.hpp,包含函数和变量的声明 Node.cpp,包含Node.hpp中声明的函数的实现 Edge.hpp,包含函数和变量的声明 Edge.cpp,包含所声明函数的实现 在Edge.hpp中 现在我实现trie的方式是,每个节点都有一个Edge类型的向量。另外,我希望Edge有一个指针Node*,这样它就指向另一个节点
,包含main()函数Launcher.cpp
,包含函数和变量的声明Trie.hpp
,包含Trie.cpp
中声明的函数的实现Trie.hpp
,包含函数和变量的声明Node.hpp
,包含Node.cpp
中声明的函数的实现Node.hpp
,包含函数和变量的声明Edge.hpp
,包含所声明函数的实现 在Edge.cpp
Edge.hpp中
节点
都有一个Edge
类型的向量。另外,我希望Edge
有一个指针Node*
,这样它就指向另一个节点(edges就是这样做的)。现在,虽然这看起来像是一个循环定义,但我记得它是可以实现的(至少,当我的程序都在一个.cpp文件中时,我能够做到这一点)
但是,由于我们现在有所有这些单独的文件,顶部有很多#include
s,我必须#在Edge.hpp
中包含'Node.hpp'
,在Node.hpp
中包含'Edge.hpp'。如果我不这样做,我会得到错误,如“此范围内未定义边”。但是如果我执行所有包含操作,我会得到一条无限循环样式的错误消息:
我正在运行的命令是
g++ -std=c++11 -Wall -o program Edge.cpp Node.cpp Trie.cpp Launcher.cpp
我希望这就是我应该跑的。有没有什么方法可以在没有这些错误的情况下实现我想要的?如果我把所有的东西都放在一个文件里,我相信这会有用的
编辑:我已经在
Edge.hpp
中完成了以下操作,似乎一切正常
\ifndef EDGE\u水电站
#定义边_水电站
#包括
类节点//正向定义
使用名称空间std;
阶级边缘{
私人:
字符串标签;
节点*pointsTo;
公众:
边();
边(字符串,节点*);
字符串getLabel();
节点*getPointsTo();
};
#恩迪夫
这是一个简单的正向声明案例
现在我实现trie的方法是每个节点都有一个向量
边缘类型
这将在节点的头文件中转换为如下内容:
class Edge;
class Node {
public:
std::vector<Edge> edges;
Node();
~Node();
};
class Node;
class Edge {
public:
Node *from_node;
Node *to_node;
// ...
};
同样,不需要包含节点的头文件
让节点
的头文件包含边缘
的头文件,而不是向前声明类,可能也可以,因为只有边缘
的头文件需要向前声明节点
类
您需要记住的唯一一件事是,任何需要使用边缘
类并使用其节点
的代码都需要包含这两个头文件。仅仅包括边缘
是不够的,因为该代码不会得到边缘指向的每个节点的声明,除非还包括节点的头文件
此外,有时前向声明可能会导致无法声明需要使用前向声明类的内联类方法。解决这个问题的方法也多种多样。这可能很容易解决。但是您需要显示您的代码。在Edge.hpp
中,向前声明就足够了;与中一样,类节点
您不需要#包括“Node.hpp”
@IgorTandetnik这算是好的做法吗?这看起来像作弊。如果你是这么问的话,这是一种非常普遍的做法。在C++中,没有其他方法可以打破循环依赖关系。它与类之间的循环引用有关,这是一种非常常见的模式,没有什么不寻常的,通常通过前向delcaration来解决。