我在图表类中工作,我刚刚开始为顶点构建一个类,而另一个用于边缘的类,我的问题通常与图形无关。
首先我构建一个名为Vertex的类,我到目前为止没有遇到任何问题,然后我开始了另一个类,它的名字是Edge,Edge有三个主要成员,其中两个有Vertex类型,第三个成员的类型为unsigned int。
这是代码:
#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());
答案 0 :(得分: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)
答案 1 :(得分: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
构造函数的主体中初始化first_vertex
和second_vertex
时,它会尝试使用默认构造函数初始化Edge
,并且它不存在,你收到一个错误。您可以通过声明Vertex() {}
构造函数来解决此问题。
答案 2 :(得分: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;
}
答案 3 :(得分:0)
您试图以错误的方式在边缘设置顶点值。使用像
这样的东西first_vertex.set_id(vertex_1.get_id());
此外,还有针对此类问题的标准表示。点击此处:http://en.wikipedia.org/wiki/Graph_%28abstract_data_type%29#Representations