Если вы думаете об этом, инстанцировании один 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 предлагает вам ознакомиться с forward declarations, вам, возможно, потребуется узнать больше о указателях и ссылках.
Поскольку у вас все еще есть проблемы, я уточню свой ответ с более подробной информацией. Я прочитал, что вы фактически разделили свои классы на два файла заголовка, я полагаю, что они Vertex.h
и Edge.h
. Они должны выглядеть примерно так:
Vertex.ч
class Edge;
class Vertex
{
Edge* CreateEdge(); // Declaration of a class function
// ...
};
edge.h
class Vertex
class Edge
{
// ...
};
Вам нужно будет включать в себя полное определение Edge
, когда вы хотите использовать его для доступа к своим членам или создания экземпляра. В основном вам нужно поместить реализации каждой функции после того, как будут определены все классы и структуры. Самый простой способ сделать это - поместить функции в свой файл .cpp
. Похоже, вы хотите создать объект Edge
из класса Vertex
, поэтому вам нужно сделать это в файле Vertex
.cpp
.
Vertex.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() { ... }
Прочитайте это: http://stackoverflow.com/questions/553682/when-to-use-forward -declaration – BartoszKP
Я не уверен, что понимаю, что такое '' Vertex''. Вершины, которые я обычно думаю, не имеют имен и/или ребер. – Shoe