0

私は C++ を学習しようとしており、グラフ内の最小スパニング ツリーを見つけるためのアルゴリズムのいくつかを実装したいと考えています。しかし、インターフェイスの作成に問題があり、どこが間違っているのかわかりません。2 つのエラーが表示されます。

エラー: 変数 'Graph::adjIterator it' には初期化子がありますが、型が不完全です

エラー: ',' または ';' が必要です 「=」トークンの前

グラフ.h

#ifndef GRAPH_H
#define GRAPH_H

#include<vector>

struct Edge {

    int v, w;
    double weight;
    Edge(int v_, int w_, double weight_ = 1) :
            v(v_), w(w_), weight(weight_) {
    }
};

class Graph {
private:
    int Vcnt, Ecnt;
    bool directedGraph;
    struct Node {

        int v;
        Node* next;
        Node(int v_, Node* next_) :
                v(v_), next(next_) {
        }

    };
    std::vector<Node*> adj;     //this is a linked list ! 

public:
    Graph(int V, bool diGraph = false) :
            adj(V), Vcnt(V), Ecnt(0), directedGraph(diGraph) {
        adj.assign(V, NULL);
    }
    int V() {
        return Vcnt;
    }
    int E() {
        return Ecnt;
    }
    bool directed() const {
        return directedGraph;
    }
    void insert(Edge e) {
        int v = e.v;
        int w = e.w;
        adj[v] = new Node(w, adj[v]);
        if (!directedGraph)
            adj[w] = new Node(v, adj[w]);
        Ecnt++;
    }
    bool egde(int v, int w) const;
//void remove(Edge e);
    class adjIterator;
    friend class adjIterator;
};

グラフ.cpp

#include "graph.h"

class Graph::adjIterator {
private:
    const Graph & G;
    int v;
    Node* t;
public:
    adjIterator(const Graph& G_, int v_) :
            G(G_), v(v_) {
        t = 0;
    }
    int begin() {
        t = G.adj[v];
        return t ? t->v : -1;
    }
    int nxt() {
        if (t)
            t = t->next;
        return t ? t->v : -1;
    }
    bool end() {
        return t == 0;
    }
};

main.cpp

#include <iostream>
#include "graph.h"

int main() {
    Graph G(2);
    Edge e(0, 1);
    G.insert(e);
    for(Graph::adjIterator it(G,0) = it.begin(); it != it.end(); it.nxt()) {
        //stuff 
    }
    return 0;
}

よろしくお願いします。

4

1 に答える 1

2

.cpp ファイルでクラス 'adjIterator' を定義し、.h で前方宣言のみを確認した別の .cpp ファイルからそれを使用しようとしました。

また、これは差し迫った問題ではありませんが、おそらく .cpp に属する .h ファイルに多くのものがあります。

通常、すべての宣言を .h に入れ、すべての実装を .cpp に入れます。

したがって、.h は次のようになります。

class myClass {
  public:
  myClass();
  void someMethod(int argument);
}

そして、.cpp は次のようになります。

myClass::myClass()
{
  //initialise stuff
}

void myClass::someMethod(int argument)
{
  //do something clever
}
于 2012-12-12T20:52:41.817 に答える