首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >初始化列表:在C++ vs Java中使用构造函数

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

Stack Overflow用户
提问于 2014-01-26 23:41:48
回答 2查看 123关注 0票数 0

回答

这是我在网站上的第一篇文章。我正在尝试构建一个图形界面,以便在C++中运行一些图形算法,但我在编译代码时遇到了困难。我将从Java转到C++,基本上,我要做的是将一个节点(两次)传递给边缘类的构造函数。也许错误就在于我所包含的方式(re:title)?节点和边缘是两个独立的类。这是我的错误:

代码语言:javascript
复制
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

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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;
}

……

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-26 23:44:09

问题是,除非另有规定,否则类的成员将在构造函数开始之前被默认构造。因此,当调用Edge构造函数时,它将尝试默认构造其两个Node成员,但它们没有默认构造函数。然后,例如,当您执行this->n_one = n_one时,您尝试将赋值复制到成员n_one,而不是使用复制构造函数来构造它。

相反,如果要在构造函数中初始化成员,则应使用成员初始化列表:

代码语言:javascript
复制
Edge::Edge(Node n_one, Node n_two, bool directed)
  : n_one(n_one), n_two(n_two), directed(directed)
{ }
票数 0
EN

Stack Overflow用户

发布于 2014-01-26 23:49:49

边缘的构造函数写得不正确,因为编译器试图默认初始化数据成员Node n_one和Node n_two;但是类Node没有默认的构造函数。

用以下方式重写边缘类的构造函数

代码语言:javascript
复制
Edge::Edge(Node n_one, Node n_two, bool directed) : n_one( n_one ), n_two( n_two ), directed( directed ) 
{
}

或者把它定义为

代码语言:javascript
复制
Edge::Edge( const Node &n_one, const Node &n_two, bool directed) : n_one( n_one ), n_two( n_two ), directed( directed ) 
{
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21370789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档