在数组上调用length时,Expression必须具有类类型

时间:2017-03-20 00:29:45

标签: c++

我正在用C ++编写一个不相交的set类,我不断收到这个错误:

  

表达式必须具有类类型

在这一行

for (int i = 0; i < array.length; i++) {

我的代码如下所示:

class DisjointSet{
private:
    int *array;
    int size;
public:

    void make_set(int elements){
        array = new int[elements];
        for (int i = 0; i < array.length; i++) {
            array[i] = i;
            size += 1;
        }
    }

当我尝试在array.length循环中获取for时出现错误。我尝试使用->运算符,但我不确定为什么这是一个问题......

2 个答案:

答案 0 :(得分:4)

您正在尝试在指针上调用成员.length,但指针没有成员或函数。

您应该使用std::vector 知道其大小

#include <vector>

class DisjointSet{
private:
    std::vector<int> array;
public:
    void make_set(int elements)
    {
        array.clear(); // clear elements
        for (int i = 0; i < elements; ++i)
        {
            array.push_back(i);
        }
    }
};

现在您不再需要维护size了,因为std::vector为您做到了这一点(std::vector::size),您不再需要担心手动内存管理,而且您赢了'多次致电make_set时,有任何泄漏。

答案 1 :(得分:0)

这一行的确切问题:

for (int i = 0; i < array.length; i++) {

array.length。如果在length array.length之后括号,则需要使用空对。由于您没有那对括号,编译器认为array是以length为其成员的类的对象。这就是编译器为您提供的原因:

  

表达式必须具有类类型

,最好在与计数器elements进行比较时使用变量i,而不是array.length()

因此,更好的解决方案是使用:

for (int i = 0; i < elements; i++)

编辑:只是一些建议,使用std::vector库而不是指针也是一个好主意。它让你的生活变得更轻松。

此外,您忘记初始化班级size的字段DisjointSet。通过在for循环中递增size,您将导致未定义的行为。