1

我做了这样的事情:

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

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

和编译器错误:

'Edge' 未在此范围内声明

如果不将这两个放入单独的标题“vertex.h”和“edge.h”中,我该如何解决这个问题?

4

3 回答 3

5

在使用 前使用前向声明Edge

struct Edge;

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

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

好读:
我什么时候可以使用前向声明?

于 2012-12-11T05:19:27.467 回答
1

您可以前向声明类型:

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

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

于 2012-12-11T05:19:59.310 回答
1

如果您的类型通过指针相互使用,您可以在定义另一个类型之前前向声明其中一个。例如像这样:

struct Vertex;
struct Edge { Vertex* v1; Vertex* v2; };
struct Vertex { list<Edge*> edges; };
于 2012-12-11T05:21:10.310 回答