我为课程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 :(得分: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
的指针非常混乱。