标识符“ V”未定义

时间:2019-09-14 20:14:54

标签: c++

我用C ++创建了一个贪婪的着色程序。运行此代码时,我收到错误消息:在第39行代码“ int result [V];”上未定义标识符V。我在第46行上有相同的变量'bool available [V];'但我在那里没有错误。我认为这与我使用的向量有关,但我不确定。任何帮助将不胜感激。

#include "stdafx.h"
#include <iostream>
#include <list>
#include <vector>
using namespace std;

class Graph
{

    vector<list<int>> adj;
public:

    Graph(int V);

    ~Graph(){}


    void addEdge(int v, int w);
    void greedyColoring(vector<bool>& available);
};

Graph::Graph(int V)
{
    adj.resize(V);

}

void Graph::addEdge(int v, int w)
{
    adj[v].push_back(w);
    adj[w].push_back(v);
}

void Graph::greedyColoring(vector<bool>& available)
{
    int result[V];

    result[0] = 0;

    for (int u = 1; u < V; u++)
        result[u] = -1;

    bool available[V];
    for (int cr = 0; cr < V; cr++)
        available[cr] = false;

    for (int u = 1; u < V; u++)
    {
        list<int>::iterator i;
        for (i = adj[u].begin(); i != adj[u].end(); ++i)
            if (result[*i] != -1)
                available[result[*i]] = true;

        int cr;
        for (cr = 0; cr < V; cr++)
            if (available[cr] == false)
                break;

        result[u] = cr;

        for (i = adj[u].begin(); i != adj[u].end(); ++i)
            if (result[*i] != -1)
                available[result[*i]] = false;
    }

    for (int u = 0; u < V; u++)
        cout << "Vertex " << u << " ---> Color"
        << result[u] << endl;
}


int main()
{
    Graph g(6);
    g.addEdge(0, 1);
    g.addEdge(0, 4);
    g.addEdge(0, 5);
    g.addEdge(1, 3);
    g.addEdge(1, 4);
    g.addEdge(2, 3);
    g.addEdge(2, 4);
    g.addEdge(4, 5);
    cout << "Coloring of the graph \n";
    g.greedyColoring();
    return 0;
}

1 个答案:

答案 0 :(得分:0)

  1. 您的类中没有名为V的数据成员,因此当您引用时 稍后在您的方法中V,则没有这样的数据成员 现有。在您的课程中声明一个类型为int的数据成员。
  2. 之后,您需要删除方法的参数 greedyColoring(),因为您在 同样的方法。如果您不删除该参数, 那么您将有一个名为available的参数 shadowing 自动变量名为available。但是我想你是这样做的 您将努力解决与available有关的错误。
  3. Variable-length array are not Standard C++,因此您不能说V,但可以改用std::vector,并且 将其调整为int result[V];的大小,然后使用V运算符,或者 随手推回元素(例如,在for循环中)。

将所有内容放在一起,您将得到:

[]

输出:

#include <iostream>
#include <list>
#include <vector>
using namespace std;

class Graph
{
    int V;
    vector<list<int>> adj;
public:

    Graph(int V);

    ~Graph(){}


    void addEdge(int v, int w);
    void greedyColoring(void);
};

Graph::Graph(int V) : V(V)
{
    adj.resize(V);

}

void Graph::addEdge(int v, int w)
{
    adj[v].push_back(w);
    adj[w].push_back(v);
}

void Graph::greedyColoring(void)
{
    vector<int> result;

    result.push_back(0);;
    for (int u = 1; u < V; u++)
        result.push_back(-1);

    vector<bool> available;
    for (int cr = 0; cr < V; cr++)
        available.push_back(false);

    for (int u = 1; u < V; u++)
    {
        list<int>::iterator i;
        for (i = adj[u].begin(); i != adj[u].end(); ++i)
            if (result[*i] != -1)
                available[result[*i]] = true;

        int cr;
        for (cr = 0; cr < V; cr++)
            if (available[cr] == false)
                break;

        result[u] = cr;

        for (i = adj[u].begin(); i != adj[u].end(); ++i)
            if (result[*i] != -1)
                available[result[*i]] = false;
    }

    for (int u = 0; u < V; u++)
        cout << "Vertex " << u << " ---> Color"
        << result[u] << endl;
}


int main()
{
    Graph g(6);
    g.addEdge(0, 1);
    g.addEdge(0, 4);
    g.addEdge(0, 5);
    g.addEdge(1, 3);
    g.addEdge(1, 4);
    g.addEdge(2, 3);
    g.addEdge(2, 4);
    g.addEdge(4, 5);
    cout << "Coloring of the graph \n";
    g.greedyColoring();
    return 0;
}