ANSWERED
这是我在网站上的第一篇文章。我正在尝试构建一个图形界面来运行C ++中的一些图形算法,但是我无法编译代码。我正在从Java转向C ++,基本上,我想要做的是将Node(两次)传递给Edge类的构造函数。也许错误是我所包括的方式(re:title)? Node和Edge是两个独立的类。这是我的错误:
Edge.cpp: In constructor ‘Edge::Edge(Node, Node, bool)’:
Edge.cpp:4: error: no matching function for call to ‘Node::Node()’
Node.h:10: note: candidates are: Node::Node(int)
Node.h:4: note: Node::Node(const Node&)
我意识到我没有定义Node()构造函数,但我正在尝试将Node的实例传递给Edge构造函数,而我没有看到添加(int)的位置应该在哪里。我希望我的问题很清楚。我包含了我认为相关的代码(省略了Node.cpp和一些Edge.cpp)。任何帮助将不胜感激。
Node.h
#ifndef NODE_H
#define NODE_H
class Node {
protected:
int label;
int visited;
public:
Node(int label);
int get_label();
void visit();
bool isVisited();
void reset();
};
#endif
Edge.h
#ifndef EDGE_H
#define EDGE_H
class Node;
class Edge {
protected:
Node n_one;
Node n_two;
bool directed;
public:
Edge(Node n_one, Node n_two, bool directed);
Node here();
Node there();
bool is_directed();
};
#endif
Edge.cpp
#include "Node.h"
#include "Edge.h"
Edge::Edge(Node n_one, Node n_two, bool directed) { //ERROR
this->n_one = n_one;
this->n_two = n_two;
this->directed = directed;
}
...
答案 0 :(得分:0)
问题是,除非另外指定,否则类的成员将在构造函数启动之前默认构造。因此,当调用Edge
构造函数时,它将尝试默认构造其两个Node
成员,但它们没有默认构造函数。例如,当您执行this->n_one = n_one
时,您正在尝试将复制复制到成员n_one
,而不是使用复制构造函数构建它。
相反,如果要在构造函数中初始化成员,则应使用成员初始化列表:
Edge::Edge(Node n_one, Node n_two, bool directed)
: n_one(n_one), n_two(n_two), directed(directed)
{ }
答案 1 :(得分:0)
Edge的构造函数写错了,因为编译器尝试默认初始化数据成员Node n_one;和节点n_two;但是Node类没有默认的构造函数。
以下列方式重写类Edge的构造函数
Edge::Edge(Node n_one, Node n_two, bool directed) : n_one( n_one ), n_two( n_two ), directed( directed )
{
}
或者最好将其定义为
Edge::Edge( const Node &n_one, const Node &n_two, bool directed) : n_one( n_one ), n_two( n_two ), directed( directed )
{
}