我在我的程序中遇到了一個循環依賴,並使用指針和轉發聲明來解決它。爲此我已經爲文件dn.hpp
做了一個文件。一切都很好,直到我轉移到共享指針而不是泛型。我在dn.hpp
中爲共享指針創建了typedefs。一切工作與通用指針(註釋掉),不包含共享。循環依賴與共享指針
它返回一個錯誤: 場「parentGraph具有不完整的類型node.h線21
(我用的MinGW與提升1.47)
請幫我解決這個問題。
這裏被簡化我的代碼版本:
dn.hpp
// forward declarations
#include <map>
#include <list>
#include <boost/shared_ptr.hpp>
class graph;
typedef boost::weak_ptr<graph> graph_wp;
typedef boost::shared_ptr<graph> graph_sp;
//typedef graph* graph_wp;
//typedef graph* graph_sp;
class node;
typedef boost::weak_ptr<node> node_wp;
typedef boost::shared_ptr<node> node_sp;
//typedef node* node_wp;
//typedef node* node_sp;
typedef std::list<node_sp> nodes_t;
class edge;
typedef boost::weak_ptr<edge> edge_wp;
typedef boost::shared_ptr<edge> edge_sp;
//typedef edge* edge_wp;
//typedef edge* edge_sp;
typedef std::list<edge_sp> edges_t;
typedef std::list<edge_wp> edgeList_t;
graph.h
#ifndef GRAPH_H_
#define GRAPH_H_
#include "node.h"
#include "edge.h"
#include "dn.hpp"
class graph
{
public:
node* createNode();
protected:
nodes_t nodes;
edges_t edges;
};
#endif /*GRAPH_H_ */
node.h
#ifndef NODE_H_
#define NODE_H_
#include "graph.h"
#include "edge.h"
#include "dn.hpp"
class node
{
public:
node();
node(graph_wp n);
node(const graph_wp& net);
virtual ~node();
edge_wp createChild();
protected:
graph_wp parentGraph;
edgeList_t edges;
};
#endif /* NODE_H_ */
edge.h
#ifndef EDGE_H_
#define EDGE_H_
#include "node.h"
#include "dn.hpp"
class edge
{
public:
edge(node_wp src,node_wp tgt);
virtual ~edge();
private:
node_sp source;
node_sp target;
};
#endif /* EDGE_H_ */
的main.cpp
#include "graph.h"
int main() {
graph n;
return 0;
}
你爲什麼說這是不工作? –
@ Stephen增加了錯誤輸出。 –
無論它對你有什麼價值,你的例子都很長,很難閱讀。如果您將程序縮減爲顯示錯誤的最小完整程序,您將得到更快,更準確的答案。當你將它簡化爲一個簡單的測試用例時,你甚至可以自己解決這個問題。請參閱http://sscce.org/。點擊[這裏](http://ideone.com/PXAsE)查看一個簡短程序的例子,演示您遇到的錯誤。 –