2014-02-11 4 views
0

Я сделал класс vertex и Edge для графа, но я не понимаю, почему Методы Edge «s GetVer1() и GetVer2() не работают! Мне нужно работать с указателями на вершины для моего проекта. Может кто-нибудь мне помочь?C++ VERTEX и классы EDGE не работают

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; 
} 
+1

Как именно они не работают? Какие результаты вы ожидали и какие результаты вы получили? Пожалуйста, включите эту информацию в свой вопрос. –

+0

Вы не определяете v1. 'Vertex v1 = e.GetVer1();' –

+0

Он просто падает! Да, я определил v1, я просто забыл его скопировать. – Maghio

ответ

1

Я нашел две проблемы.

Во-первых,

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; 
} 

будет работать. Но, как отмечается в комментариях, использование typedef Vertex в качестве указателя на vertex довольно сбивает с толку.

+0

Да, я действительно смутил два экземпляра. – Maghio

3

Не используйте ненужные определения типов, как это:

typedef class vertex *Vertex; 

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

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

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

vertex* a; 
vertex* b; 

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

+0

Да, я действительно смутил два экземпляра. Я часто использую typedefs, но с разными именами. – Maghio

 Смежные вопросы

  • Нет связанных вопросов^_^