0

我在一个图形类中工作,我刚刚开始为顶点构建一个类,为边缘构建另一个类,我的问题一般与图形无关。

首先我建立了一个名为 Vertex 的类,到目前为止我在实现它时没有遇到任何问题,然后我开始了另一个名为 Edge 的类,Edge 有三个主要成员,其中两个是 Vertex 类型,第三个成员有无符号整数类型。

这是代码:

#include<iostream>
using namespace std;



class Vertex
{
 private:
     unsigned int id;                                 
 public:   
    unsigned int get_id(){return id;};   
    void set_id(unsigned int value) {id = value;};
    Vertex(unsigned int init_val) {id = init_val;};   
    ~Vertex() {};                                     
};


class Edge
{
 private:
      Vertex first_vertex;                 // a vertex on one side of the edge
      Vertex second_vertex;                // a vertex on the other side of the edge
      unsigned int weight;                 // the value of the edge ( or its weight )     
 public:   
    Edge(Vertex vertex_1, Vertex vertex_2, unsigned int init_weight)  //constructor
    {
         first_vertex(vertex_1.get_id());
         second_vertex(vertex_2.get_id());
         weight = init_weight;
      }

    ~ Edge();   // destructor
}; 

///////////////////////////////// this part is to test the result

Vertex ver_list[2] = {7, 9};
Vertex test = 101;

int main()
{
    cout<< "Hello, This is a graph"<< endl;
    for (unsigned int i = 0; i < 2; i++) cout<< ver_list[i].get_id() << endl;      
    cout<< test.get_id() << endl;

return 0;
}

在添加构造函数 Edge 之前,代码运行没有错误,在添加构造函数 Edge 之后,我在尝试运行代码时收到错误,我无法确定我上面的错误。

感谢您的建议。

这是我收到的错误消息:

hw2.cpp: In constructor 'Edge::Edge(Vertex, Vertex, unsigned int)':
hw2.cpp:31:6: error: no matching function for call to 'Vertex::Vertex()'
      {
      ^
hw2.cpp:31:6: note: candidates are:
hw2.cpp:13:2: note: Vertex::Vertex(unsigned int)
  Vertex(unsigned int init_val) {id = init_val;};   // constructor
  ^
hw2.cpp:13:2: note:   candidate expects 1 argument, 0 provided
hw2.cpp:6:7: note: Vertex::Vertex(const Vertex&)
 class Vertex
       ^
hw2.cpp:6:7: note:   candidate expects 1 argument, 0 provided
hw2.cpp:31:6: error: no matching function for call to 'Vertex::Vertex()'
      {
      ^
hw2.cpp:31:6: note: candidates are:
hw2.cpp:13:2: note: Vertex::Vertex(unsigned int)
  Vertex(unsigned int init_val) {id = init_val;};   // constructor
  ^
hw2.cpp:13:2: note:   candidate expects 1 argument, 0 provided
hw2.cpp:6:7: note: Vertex::Vertex(const Vertex&)
 class Vertex
       ^
hw2.cpp:6:7: note:   candidate expects 1 argument, 0 provided
hw2.cpp:32:41: error: no match for call to '(Vertex) (unsigned int)'
           first_vertex(vertex_1.get_id());
                                         ^
hw2.cpp:33:42: error: no match for call to '(Vertex) (unsigned int)'
           second_vertex(vertex_2.get_id());
4

4 回答 4

3

也许问题是构造函数中的语法:

Edge(Vertex vertex_1, Vertex vertex_2, unsigned int init_weight)  //constructor
{
         first_vertex(vertex_1.get_id());
         second_vertex(vertex_2.get_id());
         weight = init_weight;
}

您应该在初始化列表中初始化成员。

Edge(Vertex vertex_1, Vertex vertex_2, unsigned int init_weight) : first_vertex(vertex_1.get_id()), second_vertex(vertex_2.get_id()), weight(init_weight)
{

}

并且您应该将 const 引用传递给 Vertex:

Edge(const Vertex& vertex_1, const Vertex& vertex_2, unsigned int init_weight)
于 2013-10-25T17:29:55.443 回答
1

hw2.cpp:32:41: 错误: 不匹配调用'(Vertex) (unsigned int)' first_vertex(vertex_1.get_id());

该错误消息在下面解决:

Edge(const Vertex& vertex_1, const Vertex& vertex_2, unsigned int init_weight)  //constructor
    : first_vertex(vertex_1.get_id()), second_vertex(vertex_2.get_id()), weight(init_weight)
  {
  }

您试图使用构造函数体内的Edge构造函数初始化顶点(而不是在它的初始化列表中)。那不是有效的语法。您要么需要使用初始化列表(显示和首选),要么在构造函数的主体中使用它们的赋值运算符(语法正确,但不是首选,因为Vertex将使用不正确的数据构造,然后初始化,而不是简单用正确的数据构造)。

一个更好的方法是利用复制构造函数Vertex(而不是你的转换构造函数):

// notice the lack of calling the get_id function
Edge(const Vertex& vertex_1, const Vertex& vertex_2, unsigned int init_weight)
    : first_vertex(vertex_1), second_vertex(vertex_2), weight(init_weight)
  {
  }

此外,还有以下错误消息:

hw2.cpp:31:6: 错误: 没有匹配函数调用'Vertex::Vertex()

您已经声明了一个非默认、非复制构造函数 ( Vertex(unsigned int init_val)),因此编译器不会为您生成默认构造函数。由于它会Vertex在您尝试初始化时尝试使用默认构造函数初始化 afirst_vertex并且在构造函数second_vertex的主体中Edge,并且它不存在,因此您会收到错误消息。您可以通过声明Vertex() {}构造函数来解决此问题。

于 2013-10-25T17:33:56.947 回答
0

可能这是修复:

Edge(Vertex vertex_1, Vertex vertex_2, unsigned int init_weight)  //constructor
{
     first_vertex = Vertex(vertex_1.get_id());
     second_vertex = Vertex(vertex_2.get_id());
     weight = init_weight;
}
于 2013-10-25T17:28:35.847 回答
0

您试图以错误的方式在边缘设置顶点值。使用类似的东西

first_vertex.set_id(vertex_1.get_id());

此外,此类问题也有标准表示。在此处查看更多信息:http ://en.wikipedia.org/wiki/Graph_%28abstract_data_type%29#Representations

于 2013-10-25T17:29:00.260 回答