Я сделал класс vertex
а также Edge
для графика, но я не понимаю, почему Edge
методы GetVer1()
а также GetVer2()
не работает! Мне нужно работать с указателями на вершины для моего проекта. Может ли кто-нибудь помочь мне?
Vertex
код:
typedef class vertex *Vertex;
class vertex {
private:
int Key;
list<Vertex> Adj;
public:
vertex() {}
vertex(int k) { Key = k }
~vertex() {}
void AddAdj(Vertex);
int GetKey();
};
void vertex::AddAdj(Vertex v)
{
Adj.push_back(v);
}
int vertex::GetKey()
{
return Key;
}
Edge
код:
class Edge {
private:
Vertex V1;
Vertex V2;
public:
Edge() {}
~Edge() {}
Edge(Vertex, Vertex);
Vertex GetVer1();
Vertex GetVer2();
};
Edge::Edge(Vertex a, Vertex b)
{
V1 = a;
V2 = b;
}
Vertex Edge::GetVer1()
{
return V1;
}
Vertex Edge::GetVer2()
{
return V2;
}
Main
код:
int main()
{
Vertex a(1);
Vertex b(2);
Edge e(a,b);
Vertex v1 = e.GetVer1();
cout << v1->GetKey(); //it doesn't work!
return 0;
}
Я нашел две проблемы.
Первый,
vertex(int k) { Key = k }
должно быть
vertex(int k) { Key = k; }
Во-вторых, с линиями
Vertex a(1);
Vertex b(2);
ты пытаешься позвонить Vertex
конструктор с целочисленными аргументами. Но Vertex
определяется как указатель на vertex
, Таким образом, нет подходящего конструктора. Мой компилятор выдает ошибку в этих строках, но похоже, что вы инициализируете указатели на адреса 1 и 2, что почти наверняка приведет к сбою.
Изменение основного на:
int main()
{
Vertex a = new vertex(1);
Vertex b = new vertex(2);
Edge e(a,b);
Vertex v1 = e.GetVer1();
cout << v1->GetKey(); //it doesn't work!delete a;
delete b;
return 0;
}
буду работать. Но, как отмечено в комментариях, использование Vertex
typedef как указатель на vertex
довольно запутанно.
Не используйте ненужные typedefs как это:
typedef class vertex *Vertex;
Это не только сбивает с толку, как указал bcrist, это источник ваших проблем. Вы объявили две «объектно-выглядящие» вещи, как это, а затем продолжили, как если бы они были объектами, когда они не:
Vertex a(1);
Vertex b(2);
Это действительно указатели, и поэтому они неинициализированы. Однако для быстрого взгляда они выглядят как объекты. Фактически ничего не стоит утверждать, что указатель используется:
vertex* a;
vertex* b;
Теперь ясно, что у вас есть указатели, и они должны указывать на действительный экземпляр вершины, прежде чем использовать их.