交叉引用类对象

cross referencing class object

本文关键字:对象 引用      更新时间:2023-10-16

我做了这样的事情:

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

和编译器错误:

在此范围内未声明"边缘"

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

在使用 Edge 之前使用前向声明

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

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

好读:
何时可以使用前向声明?

您可以转发声明类型:

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

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

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

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