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();
};
我意识到这很简单,我很想念它。请赐教。
答案 0 :(得分:3)
对于类型系统,动态大小的数组或多或少等同于指向第一个元素的指针。这就是你在构造函数中使用它的方式。
将声明更改为:
int *nums;
然后就是不使用普通数组的最佳做法,而是使用std::vector
来提供更好,更安全的操作。
答案 1 :(得分:2)
当然该行会出错,您需要指定数组的大小。如果您不想指定尺寸,请改用std::vector
。
在这种情况下,您根本不需要[]
,因为您使用nums
作为在堆上分配的普通动态数组。相反,你试图将它声明为一个(空的)指针数组,并在访问时使用解引用,这将无法正常工作。
除非您需要使用指针new
/ delete
,否则您一定要使用std::vector
(将来,每当您听到或看到“动态”和“数组“在同一个句子中,你应该首先想到std::vector
)。否则将其声明为一个简单的指针,例如
int* nums;
答案 2 :(得分:1)
错误是因为数组没有大小。您不需要[]
,并且在访问该元素时,您不需要*
:
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
通常是更好的选择。
答案 3 :(得分:1)
使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)。