字段具有不完整的类型:int*[]
Field has an incomplete type: int*[]
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
通常是更好的选择。
相关文章:
- 为什么 int 类型的枚举类值不能用作 int
- 如何将文本文件的特定行读取到 int 类型的数组中C++?
- int* 和 int[] 类型对二进制运算符 + 的操作数无效
- 比较两个整数在C++中与未知 int 类型的相等性
- 二进制'operator+' 'int*'和'int*'类型的无效操作数
- 使用元编程选择 int 类型,将生成错误
- 从数组创建 Mat 时,'cv::Mat' 和 'int' 类型不兼容
- 复制初始化 - 从 'int' 类型转换为非标量类型
- 初始化cv :: mat ::具有int类型的定义大小的人
- 处理代码重新定义int类型(uint16_t,int16_t等),并不喜欢它
- 为什么没有"int"类型声明时输出不同?
- 在大型程序中将长变量更改为 int 类型
- 无法将 int 类型转换为时间类型(我的类类型)
- C++:无法在按位函数后将 int 类型设置为非标量
- 无法分配给INT类型的成员[10]
- C++ cin 将字符串读取到 int 类型中返回 0
- 为什么 decltype((i)) 是引用类型,而 decltype(i+0) 是 int 类型
- 使用4用于循环的4矩阵上的数组下标的“ int [int]类型”
- std::is_arithmetic 为通用 lambda 中的 int 类型返回 false:未定义的行为?
- 正在施放带有“ Int”类型的临时性