我正在用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
时出现错误。我尝试使用->
运算符,但我不确定为什么这是一个问题......
答案 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
,您将导致未定义的行为。