【问题标题】:Circular dependency with shared pointers共享指针的循环依赖
【发布时间】:2012-05-23 08:39:07
【问题描述】:

我在我的程序中遇到了循环依赖,并通过使用指针和前向声明解决了它。为此,我制作了一个文件dn.hpp。一切都很好,直到我转向共享指针而不是通用指针。我在dn.hpp 中为共享指针创建了typedef。一切都适用于通用指针(已注释掉),而不是共享。

它返回一个错误: 字段“parentGraph”的类型不完整 node.h 第 21 行

(我正在使用带有 boost 1.47 的 mingw)

请帮我解决这个问题。

这是我的代码的简化版本:

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_ */

ma​​in.cpp

#include "graph.h"
int main() {
    graph n;
    return 0;
}

【问题讨论】:

  • 为什么说它不起作用?
  • @Stephen 添加了错误输出。
  • 不管对你来说有什么价值,你的例子非常长而且难以阅读。如果您将您的程序缩减为显示错误的最小完整程序,您将获得更快、更准确的答案。当您将问题简化为一个简单的测试用例时,您甚至可以自己解决问题。见sscce.org。单击here 以获取演示您遇到的错误的简短程序示例。
  • 为什么每个标题都包含其他标题?例如,edge.h 不需要包含 node.h。当然,dn.hpp 的目的是打破这些依赖关系,为什么您仍然(尝试)在每个文件中包含所有内容?
  • @Jonathan 实际上 enge 有 node_wp 成员,它应该包括 node.h。最终将包含所有这些文件。 dh.hpp 只允许以正确的方式放置前向声明。毕竟它是示例文件。真正的要复杂得多。

标签: c++ shared-ptr circular-dependency


【解决方案1】:

当我用 VisualStudio 编译你的代码时,我得到了

error C2079: 'node::parentGraph' uses undefined class 'boost::weak_ptr<Y>'
with
[
    Y=graph
]

添加

#include <boost/weak_ptr.hpp>

解决这个问题

【讨论】:

  • 是的,解决了它。战斗weak_ptrshared_ptr 的一部分。至少我的编译器(gcc 4.7)没有出现此类消息的错误。谢谢。
猜你喜欢
  • 2019-09-07
  • 2020-02-13
  • 2015-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-18
  • 2012-01-21
  • 1970-01-01
相关资源
最近更新 更多