【问题标题】:C++ VERTEX and EDGE classes don't workC++ VERTEX 和 EDGE 类不起作用
【发布时间】:2014-02-11 17:27:14
【问题描述】:

我为图表创建了 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;
}

【问题讨论】:

  • 它们到底是如何不起作用的?你期待什么结果,你得到了什么结果?请在您的问题中包含此信息。
  • 您没有定义 v1。 Vertex v1 = e.GetVer1();
  • 它简直崩溃了!是的,我定义了 v1,我只是忘了复制它。
  • 崩溃时的错误信息究竟是什么。您是否使用调试器来确定崩溃的位置?
  • typedef class vertex *Vertex; 充其量是令人困惑的,最坏的情况是等待发生的灾难。

标签: c++ data-structures graph


【解决方案1】:

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

typedef class vertex *Vertex;

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

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

这些实际上是指针,因此未初始化。但是对于快速浏览者来说,它们看起来像物体。实际声明正在使用指针不需要任何成本:

vertex* a;
vertex* b;

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

【讨论】:

  • 是的,我真的混淆了这两个实例。我经常使用 typedef,但名称不同。
【解决方案2】:

我发现了两个问题。

首先,

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

会起作用。但是,正如 cmets 中所指出的,使用 Vertex typedef 作为指向 vertex 的指针非常令人困惑。

【讨论】:

  • 是的,我真的混淆了这两个实例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
相关资源
最近更新 更多