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

时间:2013-11-13 07:40:00

标签: c++ arrays pointers types dynamic-arrays

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 个答案:

答案 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)。