错误22错误C2228:'。size'的左边必须有class / struct / union

时间:2013-09-17 02:41:10

标签: c++ class compiler-errors

我知道这有很多重复,但没有一个答案似乎有帮助。

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 ++的新手)。 其他人可以看到什么吗?错误也在其他方法中。

2 个答案:

答案 0 :(得分: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]);
        }   
    } 
}

答案 1 :(得分:-1)

void Graph::explore(Vertex *v)

将v定义为指向顶点的指针。您可以使用v-&gt;成员引用它的成员。我建议将定义更改为:

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定义为指向顶点的指针,但它会更改成员访问和递归调用以反映这一点。