回答
这是我在网站上的第一篇文章。我正在尝试构建一个图形界面,以便在C++中运行一些图形算法,但我在编译代码时遇到了困难。我将从Java转到C++,基本上,我要做的是将一个节点(两次)传递给边缘类的构造函数。也许错误就在于我所包含的方式(re:title)?节点和边缘是两个独立的类。这是我的错误:
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();
};
#endifEdge.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();
};
#endifEdge.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;
}……
发布于 2014-01-26 23:44:09
问题是,除非另有规定,否则类的成员将在构造函数开始之前被默认构造。因此,当调用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)
{ }发布于 2014-01-26 23:49:49
边缘的构造函数写得不正确,因为编译器试图默认初始化数据成员Node n_one和Node n_two;但是类Node没有默认的构造函数。
用以下方式重写边缘类的构造函数
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 )
{
}https://stackoverflow.com/questions/21370789
复制相似问题