如果您考虑一下,实例化单个Vertex
或Edge
对象将实例化无限数量的更多Vertex
和Edge
对象,因为它们中的每一个都包含彼此的实例。
要解决此问题,您需要转发声明一个类,该类取决于您首先使用的类。前向声明类允许您在不实际使用类的情况下使用指针和对它们的引用,只指向它。
这个片段应该是可编译的,但它需要一些额外的内存管理。
class Edge; // This is a forward declaration
class Vertex {
string name;
int distance;
//Vertex path;
int weight;
bool known;
list<Edge*> edgeList;
list<Vertex*> adjVertexList;
public:
Vertex();
Vertex(string nm);
virtual ~Vertex();
};
class Edge {
Vertex* target;
int weight;
public:
Edge();
Edge(Vertex* v, int w);
virtual ~Edge();
Vertex* getTarget();
void setTarget(Vertex* target);
int getWeight();
void setWeight(int weight);
};
这段代码可以编译,因为类现在包含指向对象的指针,而不是对象本身。
正如 BartoszKP 建议的那样,您应该阅读前向声明,并且您可能还需要了解更多关于指针和引用的知识。
由于您仍然遇到问题,我将使用更多详细信息更新我的答案。我读到您现在实际上已将您的类拆分为两个头文件,我假设它们是Vertex.h
和Edge.h
. 他们应该看起来像这样
顶点.h
class Edge;
class Vertex
{
Edge* CreateEdge(); // Declaration of a class function
// ...
};
边缘.h
class Vertex
class Edge
{
// ...
};
您将需要包含关于Edge
何时使用它来访问其成员或创建实例的完整定义。基本上,您需要在定义所有类和结构之后放置每个函数的实现。最简单的方法是将函数实现放在各自的.cpp
文件中。似乎您想Edge
从Vertex
类中创建一个对象,因此您需要在您Vertex
的.cpp
文件中执行此操作。
顶点.cpp
#include "Vertex.h"
#include "Edge.h"
Edge* Vertex::CreateEdge()
{
return new Edge();
}
因为在这个.cpp
文件中做的第一件事是包含Vertex
和Edge
头文件,它们有各自的类定义,你可以完全按照你的意愿使用Vertex
和类。Edge
您需要按照一定的顺序组织声明和定义,如下所示
// Regarding global functions
Declaration // void MyFunction();
Definition // void MyFunction() { ... }
// Regarding classes and structs
Declaration // class MyClass; - Forward declaration in another header file
Definition // class MyClass { ... } - Definition in actual header file
// Regarding class functions
Declaration // class MyClass { void MyFunction(); }
Definition // void MyClass::MyFunction() { ... }