交叉引用类对象

时间:2012-12-11 05:17:14

标签: c++

我做了类似的事情:

struct Vertex {
  list<Edge*> edges;
};

struct Edge {
  Vertex* v1;
  Vertex* v2;
};

和编译器错误:

  

'Edge'未在此范围内声明

如何在不将这两个标题放入单独的标题“vertex.h”和“edge.h”的情况下解决这个问题?

3 个答案:

答案 0 :(得分:5)

在使用Edge之前使用转发声明

struct Edge;

struct Vertex 
{
    list<Edge*> edges;
};

请注意,当您转发声明类型时,编译器将该类型视为不完整类型,它不知道该类型的布局,但它只知道该类型存在,因此对于如何使用不完整类型存在一些限制。

好读:
When can I use a forward declaration?

答案 1 :(得分:1)

您可以转发声明类型:

struct Vertex;
struct Edge {
   Vertex* v1;
   Vertex* v2;
};

话虽这么说,让顶点知道它的边缘列表可能不是图形的好设计;如果你想在多个图中重用相同的顶点怎么办? (例如,机场可能是不同人使用的多个不同行程中的合理顶点。)

答案 2 :(得分:1)

如果你的类型通过指针互相使用,你可以在定义另一个之前转发声明其中一个。例如:

struct Vertex;
struct Edge { Vertex* v1; Vertex* v2; };
struct Vertex { list<Edge*> edges; };