初始化列表:在C ++和Java中使用构造函数

时间:2014-01-26 23:41:49

标签: c++ header

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

...

2 个答案:

答案 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 ) 
{
}