C ++ VERTEX和EDGE类不起作用

时间:2014-02-11 17:27:14

标签: c++ data-structures graph vertex edge

我为课程vertexEdge创建了一个图表,但我不明白为什么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;
}

2 个答案:

答案 0 :(得分:3)

不要使用这样的不必要的typedef:

typedef class vertex *Vertex;

正如bcrist指出的那样,它不仅令人困惑,而且是你问题的根源。你声明了两个这样的“看起来像对象”的东西,然后当它们不是时,它们就像是对象一样:

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

这些都是指针,因此未初始化。然而,对于快速浏览器,它们看起来像物体。实际声明正在使用指针不需要任何费用:

vertex* a;
vertex* b;

现在很明显你有指针,他们需要在使用它们之前指向一个有效的顶点实例。

答案 1 :(得分:1)

我发现了两个问题。

首先,

vertex(int k) { Key = k }

应该是

vertex(int k) { Key = k; }

第二,用线

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

您正尝试使用整数参数调用Vertex构造函数。但Vertex被定义为指向vertex的指针。因此,没有合适的构造函数。我的编译器在这些行上给出了错误,但听起来你可能正在初始化指向地址1和2的指针,这几乎肯定会导致崩溃。

将main更改为:

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的指针非常混乱。