2016-10-19 8 views
-1

おはようございます。C++ 'Nodo :: Nodo()'の呼び出しに一致する関数がありません

ノードとエッジがリストとして記憶されたグラフをC++で実装しようとしています。私はイタリア語なので、graph/Grafo、edge/Arco、node/Nodo、listEdges/ListaArchi、listNodes/ListaNodiです。

これは私のコードです:

Grafo.h

#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_ */ 

Grafo.cpp

#include "Grafo.h" 

Grafo::Grafo() { 
} 

Grafo::~Grafo() { 
} 

void Grafo::aggiungiNodo(std::string nomeNodo) { 
} 

void Grafo::leggiGrafo(std::string nomeFile){ 
} 

Arco.h

#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:12:10

:エラー: 'ここNodo Nodo ::()'

#include "Arco.h" 

Arco::Arco() { 
    // TODO Auto-generated constructor stub 
    next = NULL; 
} 

Arco::~Arco() { 
    // TODO Auto-generated destructor stub 
} 

Nodo.h

他の問題への呼び出しに該当する機能Nodo.h:15:2:エラー:余分な資格 'Nodo ::' 'Nodo' [-fpermissive]

#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_ */ 

Nodo.cpp

メンバーに
#include "Nodo.h" 
#include <string> 

Nodo::Nodo(std::string nome) { 
    this->nome = nome; 
    this->colore = "white"; 
    next=NULL; 
} 

Nodo::~Nodo() { 

} 

Arco.h

ここ

その他の問題:

ListaArchi.h:16:2:エラー: 'アルコ' はタイプ

#ifndef LISTAARCHI_H_ 
#define LISTAARCHI_H_ 
#include "Arco.h" 

class ListaArchi { 
public: 
    ListaArchi(); 
    virtual ~ListaArchi(); 
    Arco arco; 
}; 

#endif /* LISTAARCHI_H_ */ 
に名前を付けていない

ListaArchi.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_ */ 

ListaNodi.cpp

#include "ListaNodi.h" 

ListaNodi::ListaNodi() { 
    nodo = NULL; 
} 

ListaNodi::~ListaNodi() { 

} 

は、誰もがこれらの問題で私を助けてもらえますか?

+0

あなたは 'Nodo'のためのデフォルトのコンストラクタを持っていませんが、それは他の場所で必要です。 .. ListaNodi')。 –

+0

Nodo :: inside class bodyを削除する – Aaron

+0

また、クラス間に循環依存関係があります。 (それが「 'アルコのタイプにはならない」の理由です。)その問題を解決する方法については、多くの答えがあります。 – molbdnilo

答えて

1

複数の問題があります。 1つは、ListaNodiクラスでNodiクラスを使用してオブジェクトnodoを宣言することです。これはデフォルトのコンストラクタNodiを使用しますが、宣言または定義していません。文字列を取るコンストラクタのみ。

上記の単純な解決策は、デフォルトのコンストラクタ、つまり引数を取らないコンストラクタを作成することです。

もう一つの問題は、あなたがここで

nodo = NULL; 

を行うListaNodiコンストラクタの実装、であるあなたはそれがないのポインタとしてnodoを扱います。もちろん

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

、デフォルトコンストラクタを作成することにより、上記第一の問題点を修正したする必要があります。これを解決するには、その行を削除し、代わりにコンストラクタ初期化子リストを使用することです。

さらに、クラス定義Nodoでは、スコープを使用して(デフォルト以外の)コンストラクタを宣言しますが、これは必要ありません。

平野

Nodo(std::string nome); 

はあなたが必要とするすべてです。

最後に、ListaArchiListaArchiに依存するNodoに依存するArcoに依存する循環ヘッダーファイルの依存関係に問題があります。ヘッダーファイルの依存関係を解除する方法を見つける必要があります。そのような円を壊す最も簡単な方法は、どこかでポインタを使用し、ヘッダファイルをインクルードするのではなく、その型の宣言を転送することです。


彼らはおそらく最初からあるべき何か、あなたは非常に簡単にリストクラスはポインタであることに「ノード」を行うことで、ヘッダ・ファイル循環依存関係を壊すことができることを意味、あなたがリストを作っているようです。それは私が言及した2つの最初の問題を実際に解決します。

その後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} 
{ 
} 
関連する問題