2
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();
};

我意识到这很简单,我很想念它。请赐教。

4

4 回答 4

3

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

将声明更改为:

int *nums;

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

于 2013-11-13T07:42:25.400 回答
2

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

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

除非你必须使用指针和new/ delete,否则你绝对应该使用std::vector(将来,当你在同一个句子中听到或看到“动态”和“数组”这两个词时,你应该首先想到std::vector)。否则将其声明为只是一个简单的指针,例如

int* nums;
于 2013-11-13T07:42:14.387 回答
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顺便说一句,通常是更好的选择。

于 2013-11-13T07:43:37.407 回答
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::vectorC 样式的数组代替仍然更合理(除非由于某种原因不能使用向量)。

于 2013-11-13T07:45:29.850 回答