字段具有不完整的类型:int*[]

Field has an incomplete type: int*[]

本文关键字:int 类型 字段      更新时间:2023-10-16
class NumberArray {
int *nums []; // this line gets error for incomplete type int *[]
int size_;
public:
    NumberArray(const int i){nums = new int[i]; size_ = i;}
    ~NumberArray(){delete [] *nums;}
    void set(int i, int n){(*nums)[i] = n;}
    int get(int i){return (*nums)[i];}
    int min();
    int max();
    double avg();
};

我意识到这是一件非常简单的事情,但我错过了它。 请开导我。

对于类型系统,动态大小的数组或多或少等同于指向第一个元素的指针。这也是您在构造函数中使用它的方式。

将声明更改为:

int *nums;

然后是完全不使用普通数组的最佳实践,而是使用std::vector,以提供更好、更安全的操作。

当然,该行会出现错误,您需要为数组指定大小。如果不想指定大小,请改用std::vector

在这种情况下,您根本不需要[],因为您将nums用作在堆上分配的纯动态数组。相反,您尝试将其声明为(空)指针数组,并且在访问它时使用取消引用,这将不能很好地工作。

除非你需要使用指针和new/delete,那么你绝对应该使用std::vector(以后,每当你听到或看到同一个句子中的"动态"和"数组"这两个词时,你首先应该想到std::vector)。否则将其声明为一个简单的指针,例如

int* nums;

nums是一个简单的指针。然后,您的代码可能如下所示:

class NumberArray {
int *nums; 
int size_;
public:
    NumberArray(const int i) : size_(i) { nums = new int[i]; }
    ~NumberArray(){ delete[] nums; }
    void set(int i, int n){ nums[i] = n; }
    int get(int i){ return nums[i]; }
    ...
};

尽管此类包装了动态分配的数组并利用了 RAII,但使用std::vector而不是 C 样式数组仍然更合理(除非由于某种原因无法使用 vector)。

错误是因为数组没有大小。您不需要[],并且在访问元素时,也不需要*

class NumberArray {
int *nums;   //<---
int size_;
public:
    NumberArray(const int i){nums = new int[i]; size_ = i;}
    ~NumberArray(){delete [] nums;}       //<---
    void set(int i, int n){nums[i] = n;}  //<---
    int get(int i){return nums[i];}       //<---
    int min();
    int max();
    double avg();
};

顺便说一下,std::vector通常是更好的选择。