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 的成员为 v.member

另一种解决方案(不推荐,使用参考更好)是

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 回答