我正在C++中實現後綴特里結構,其中我使用三個類Trie
,Node
和Edge
。由於我使用的是類,所以我已經將我的函數/變量聲明分離爲各自的.cpp文件中的頭文件(.hpp)文件及其實現。現在我不習慣這樣做(我通常用於將所有內容寫入一個.cpp文件),但我認爲這對於可讀性和結構都是有利的。C++中的循環指針
所以,我有以下文件:
Launcher.cpp
,包含main()函數。Trie.hpp
,包含函數和變量的聲明。Trie.cpp
,包含在Trie.hpp
中聲明的函數的實現。Node.hpp
,包含函數和變量的聲明。Node.cpp
,包含在Node.hpp
中聲明的函數的實現。Edge.hpp
,包含函數和變量的聲明。Edge.cpp
,包含在Edge.hpp
中聲明爲 的函數的實現。
現在我已經實現了trie的方式是每個Node
都有一個向量類型Edge
。另外,我希望Edge
有一個指針Node*
,以便它指向另一個節點(這是邊緣所做的)。現在雖然這看起來像是一個循環定義,但我記得它可以實現(至少,我曾經能夠在我的程序全部在一個.cpp文件中時做到這一點)。
但由於我們現在有很多的#include
s的頂部所有這些單獨的文件,我不得不#include 'Node.hpp'
在Edge.hpp
,並在Node.hpp
#include 'Edge.hpp'
。如果我不這樣做,我會遇到諸如「邊界未在此範圍內定義」等錯誤。但是,如果我做所有的包括,我得到一個無限循環式的錯誤信息:
我跑的命令是
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
這可能很容易解決。但是你需要顯示你的代碼。 – selbie
在'Edge.hpp'中,前向聲明應該足夠了;如'class Node;'你不需要'#include'Node.hpp「' –
@IgorTandetnik雖然這被認爲是很好的做法嗎?這似乎是作弊。 –