C++ 调用'Nodo::Nodo()'没有匹配功能

C++ No matching function for call to 'Nodo::Nodo()'

本文关键字:Nodo 功能 调用 C++      更新时间:2023-10-16

早上好。

我正在尝试在 c++ 中实现一个图形,其中节点和边缘被记忆为列表。我是意大利人,所以:graph/Grafo,edge/Arco ,node/Nodo ,listEdges/ListaArchi,listNodes/ListaNodi。

这是我的代码:

格拉福·

#ifndef GRAFO_H_
#define GRAFO_H_
#include "ListaNodi.h"
class Grafo {
public:
    Grafo();
    virtual ~Grafo();
    void leggiGrafo(std::string nomeFile);
    void aggiungiNodo(std::string nomeNodo);
private:
    std::string nomeGrafo;
    ListaNodi nodi;
};
#endif /* GRAFO_H_ */

格拉福.cpp

#include "Grafo.h"
Grafo::Grafo() {
}
Grafo::~Grafo() {
}
void Grafo::aggiungiNodo(std::string nomeNodo) {
}
void Grafo::leggiGrafo(std::string nomeFile){
}

阿科·

#ifndef ARCO_H_
#define ARCO_H_
#include <string>
#include "Nodo.h"
class Arco {
public:
    Arco();
    virtual ~Arco();
    Arco *next;
    std::string style;
    std::string color;
private:
    Nodo primo;
    Nodo secondo;
};
#endif /* ARCO_H_ */

Arco.cpp(这是问题所在:

Arco.cpp:10:12:错误:调用"Nodo::Nodo(("没有匹配函数

#include "Arco.h"
Arco::Arco() {
    // TODO Auto-generated constructor stub
    next = NULL;
}
Arco::~Arco() {
    // TODO Auto-generated destructor stub
}

诺多·

这里的其他问题:

Nodo.h:15:2:错误:成员"Nodo"上的额外限定"Nodo::"[-允许]

#ifndef NODO_H_
#define NODO_H_
#include <string>
#include "ListaArchi.h"
class Nodo {
public:
    Nodo::Nodo(std::string nome);
    virtual ~Nodo();
    void setColore(std::string colore);
    ListaArchi listaArchi;
    Nodo *next;
private:
    std::string colore;
    std::string nome;
    std::string label;
};
#endif /* NODO_H_ */

诺多.cpp

#include "Nodo.h"
#include <string>
Nodo::Nodo(std::string nome) {
    this->nome = nome;
    this->colore = "white";
    next=NULL;
}
Nodo::~Nodo() {
}

阿科·

这里的其他问题:

ListaArchi.h:16:2:错误:"Arco"未命名类型

#ifndef LISTAARCHI_H_
#define LISTAARCHI_H_
#include "Arco.h"
class ListaArchi {
public:
    ListaArchi();
    virtual ~ListaArchi();
    Arco arco;
};
#endif /* LISTAARCHI_H_ */

利斯塔阿奇.cpp

#include "ListaArchi.h"
ListaArchi::ListaArchi() {
}
ListaArchi::~ListaArchi() {
}

ListaNodi.h

#ifndef LISTANODI_H_
#define LISTANODI_H_
#include "Nodo.h"
class ListaNodi {
public:
    ListaNodi();
    virtual ~ListaNodi();
    Nodo nodo;
};
#endif /* LISTANODI_H_ */

利斯塔诺迪.cpp

#include "ListaNodi.h"
ListaNodi::ListaNodi() {
    nodo = NULL;
}
ListaNodi::~ListaNodi() {
}

谁能帮我解决这些问题?

您有多个问题。一个是在你的ListaNodi类中使用Nodi类来声明一个对象nodo。这将使用 Nodi 的默认构造函数,但您尚未声明或定义一个。只有一个接受字符串的构造函数。

上述简单的解决方案是创建一个Nodi默认构造函数,即不带参数的构造函数。

另一个问题是在ListaNodi构造函数实现中,你这样做

nodo = NULL;

在这里,您将nodo视为指针,但事实并非如此。解决方案是删除该行,改用构造函数初始值设定项列表:

ListaNodi::ListaNodi()
    : nodo{}
{
}

当然,这需要您通过创建默认构造函数来解决上述第一个问题。

此外,在 Nodo 的类定义中,您使用作用域声明(非默认(构造函数,这是不需要的。

平原

Nodo(std::string nome);

是你所需要的一切。

最后,您遇到了循环头文件依赖项的问题,其中ListaArchi取决于Arco取决于Nodo取决于ListaArchi。你需要找到一种方法来打破头文件依赖循环。打破这种循环的最简单方法是在某处使用指针,并转发声明类型,而不是包含头文件。


看起来您正在制作列表,这意味着您可以通过使列表类中的"节点"成为指针来非常轻松地打破头文件循环依赖关系,它们可能从一开始就应该如此。这实际上也将解决我提到的前两个问题。

然后ListaArchi.h头文件可能如下所示:

#ifndef LISTAARCHI_H_
#define LISTAARCHI_H_
class Arco;  // Forward declaration instead of header file inclusion
class ListaArchi {
public:
    ListaArchi();
    virtual ~ListaArchi();
    Arco* arco;  // Declares as a pointer
};
#endif /* LISTAARCHI_H_ */

ListaNode.h应该看起来像

#ifndef LISTANODI_H_
#define LISTANODI_H_
class Nodo;  // Forward declaration instead of header file inclusion
class ListaNodi {
public:
    ListaNodi();
    virtual ~ListaNodi();
    Nodo* nodo;  // Declare as a pointer
};
#endif /* LISTANODI_H_ */

最后,您的ListaNodi构造函数对NULL赋值更有意义,但我建议您仍然使用构造初始值设定项列表:

ListaNodi::ListaNodi()
    : nodo{nullptr}
{
}