структуры данных — классы C ++ VERTEX и EDGE не работают

Я сделал класс 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;
}

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 довольно запутанно.

1

Другие решения

Не используйте ненужные typedefs как это:

typedef class vertex *Vertex;

Это не только сбивает с толку, как указал bcrist, это источник ваших проблем. Вы объявили две «объектно-выглядящие» вещи, как это, а затем продолжили, как если бы они были объектами, когда они не:

Vertex a(1);
Vertex b(2);

Это действительно указатели, и поэтому они неинициализированы. Однако для быстрого взгляда они выглядят как объекты. Фактически ничего не стоит утверждать, что указатель используется:

vertex* a;
vertex* b;

Теперь ясно, что у вас есть указатели, и они должны указывать на действительный экземпляр вершины, прежде чем использовать их.

3

По вопросам рекламы [email protected]