gpt4 book ai didi

c++ - C++ 中的循环指针

转载 作者:搜寻专家 更新时间:2023-10-31 02:13:22 24 4
gpt4 key购买 nike

我正在用 C++ 实现一个后缀树结构,其中我使用了三个类,TrieNodeEdge。因为我使用的是类,所以我将我的函数/变量声明分离到头文件 (.hpp) 中,并在各自的 .cpp 文件中实现它们。现在我不习惯这样做(我通常习惯将所有内容都写在一个 .cpp 文件中),但我认为这对于可读性和结构都是有利的。

所以我有以下文件:

  • Launcher.cpp,包含 main() 函数。
  • Trie.hpp,包含函数和变量的声明。
  • Trie.cpp,包含在Trie.hpp中声明的函数的实现。
  • Node.hpp,包含函数和变量的声明。
  • Node.cpp,包含在Node.hpp中声明的函数的实现。
  • Edge.hpp,包含函数和变量的声明。
  • Edge.cpp,包含声明函数的实现在 Edge.hpp 中。

现在我实现 trie 的方式是每个 Node 都有一个 Edge 类型的 vector 。此外,我希望 Edge 有一个指针 Node* 以便它指向另一个节点(这就是 edges 所做的)。现在虽然这看起来像是一个循环定义,但我记得它是可以实现的(至少,当我的程序都在一个 .cpp 文件中时,我曾经能够做到这一点)。

但由于我们现在拥有所有这些单独的文件,顶部有很多 #include,我必须在 #include 'Node.hpp' Edge.hpp,以及 Node.hpp 中的#include 'Edge.hpp'。如果我不这样做,我会收到诸如“Edge is not defined in this scope”之类的错误。但是如果我执行所有包含,我会收到一条无限循环式的错误消息:

enter image description here

我正在运行的命令是

g++ -std=c++11 -Wall -o program Edge.cpp Node.cpp Trie.cpp Launcher.cpp

我希望这就是我应该运行的。有什么办法可以在没有这些错误的情况下实现我想要的目标吗?如果我将所有内容都放入一个文件中,我确信这会奏效。


编辑:我在 Edge.hpp 中完成了以下操作,一切似乎都运行良好!

#ifndef EDGE_HPP
#define EDGE_HPP

#include <string>

class Node; //Forward definition

using namespace std;

class Edge{

private:
string label;
Node* pointsTo;

public:
Edge();
Edge(string, Node*);
string getLabel();
Node* getPointsTo();

};

#endif

最佳答案

这是前向声明的一个简单例子。

Now the way I've implemented the trie is that each Node has a vector of type Edge.

在 Node 的头文件中,这将被翻译成类似这样的内容:

class Edge;

class Node {

public:
std::vector<Edge> edges;

Node();
~Node();
};

这足以在其头文件中声明节点。不需要包含 Edge 的头文件。

现在,定义 Node 的构造函数和析构函数的 .cpp 文件必须包含两个头文件,以便两个类都被完整声明。

Additionally, I want that Edge has a pointer Node* so that it is pointing to another node (this is what edges do).

这在 Edge 的头文件中简单地转化为:

class Node;

class Edge {

public:
Node *from_node;
Node *to_node;

// ...
};

同样,不需要包含 Node 的头文件。

Node 的头文件包含 Edge 的头文件,而不是转发声明类,可能也很好,只有 Edge 的头文件需要转发声明 Node 类。

您唯一需要记住的是,任何需要使用 Edge 类并使用其 Node 的代码都需要包含两个头文件。仅仅包含 Edge 是不够的,因为该代码不会获得边指向的每个 Node 的声明,除非 Node的头文件也包含在内。

此外,有时前向声明可能会导致无法声明需要使用前向声明类的内联类方法。也有多种解决方法。

关于c++ - C++ 中的循环指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41537332/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com