0

これにはたくさんの重複があることは知っていますが、どの回答も役に立たないようです。

class Vertex 
{
public:
    string           name;   // Vertex name
    vector<Vertex *>  adj;   // Adjacent vertices
    int              dist;   // Cost
    Vertex          *path;   // Previous vertex on shortest path
    bool          visited;

    Vertex( const string & nm ) : name( nm )
      { reset( ); }

    void reset( )
      { dist = INFINITY; path = NULL; }
};

void Graph::explore(Vertex *v)
{
    //error for v.visited
    //error for anything where 'v' is referenced.
    v.visited = true;
    int total;

    for(int i = 0; i < v.adj.size(); i++)
    {
        cout << v.adj.name << " to ";
        if (!v.visited)
        {
            explore(v.adj[i]);
        }   
    } 
}

他の投稿を読んでもエラーの原因を特定できません。(私はc ++が初めてです)。他の誰かが何かを見ることができますか?エラーは他のメソッド内にもあります。

4

2 に答える 2

2

v->はポインターであるため、オブジェクト メンバー アクセス演算子 ( ) の代わりにポインター メンバー アクセス演算子 ( ) を使用する必要があります.

void Graph::explore(Vertex *v)
{
    v->visited = true;
    int total;

    for(int i = 0; i < v->adj.size(); i++)
    {
        cout << v->name << " to "; // this should be v->name,
                                   // not v->adj.name
        if (!v->visited)
        {
            explore(v->adj[i]);
        }   
    } 
}
于 2013-09-17T02:45:16.653 に答える
-1
void Graph::explore(Vertex *v)

v を頂点へのポインターとして定義します。v->member でメンバーを参照できます。定義を次のように変更することをお勧めします。

void Graph::explore(Vertex &v)

これは v を (参照を使用して) 頂点として定義します。関数が呼び出されたときにデータ構造全体がスタックされないようにするための単なる最適化です。次に、v.member として v のメンバーにアクセスできます。

別の解決策 (推奨されません。参照を使用する方が良い) は次のとおりです。

void Graph::explore(Vertex *v)
{
    //error for v.visited
    //error for anything where 'v' is referenced.
    v->visited = true;
    int total;

    for(int i = 0; i < v->adj.size(); i++)
    {
        cout << v->adj.name << " to ";
        if (!v->visited)
        {
            explore(& (v->adj[i]) );
        }   
    } 
}

頂点へのポインターとして定義された v を保持しますが、これを反映するようにメンバー アクセスと再帰呼び出しを変更します。

于 2013-09-17T02:51:18.440 に答える