在数组上调用长度时,表达式必须具有类类型

Expression must have class type when calling length on an array

本文关键字:类型 表达式 数组 调用      更新时间:2023-10-16

我正在用C++编写一个不相交的集合类,但不断收到此错误:

表达式必须具有类类型

在这一行

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;
        }
    }

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

您正在尝试在指针上调用成员.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时,你不会有任何泄漏。

这一行中的确切问题:

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

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

表达式必须具有类类型

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

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

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

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

此外,您忘记初始化类DisjointSet的字段size。通过增加 for 循环中的size,您会导致未定义的行为。

相关文章: