在标头中声明一个没有大小的动态数组,在.cpp中定义

时间:2013-06-04 12:00:00

标签: c++ dynamic-arrays

我正在编写一个具有动态二维整数数组作为字段的类 - 最重要的一部分,短访问时间是首选。我想在头文件中声明它,

//Grid.h
class Grid{
  int ** array;
}

但是它的大小和内容尚未在cpp文件中实现的构造函数中定义(可以从ini文件中读取)。

我不确定是否在标头中声明int **array指针,并使用

为其稍后分配动态数组
array = new int*[x];  
 for(i=0;i<x;i++){    
array[i] = new int [y];    
}

将导致创建一个可访问的数组,并且在其定义中直接调用array[i][j]字段的其他函数(或其他不太明显的错误)中不会造成任何麻烦,但是在上述函数开始调用之前,它被授予在,它必须已经定义。

我的问题 - 这是一种有效而有效的方法吗?我会接受任何其他想法 是的,我听说过“矢量”类,但我不确定它的效率或读写与整数数组的性能。向量的大小是灵活的,但我不需要它 - 我的数组一旦设置,将具有固定的大小。

我可能已经习惯了Java风格的int[][] array代码。

1 个答案:

答案 0 :(得分:3)

是的,您的方式有效且有效。唯一的问题(显然)是确保你没有超过限制(Java检查对你来说,用C你必须确保你在[0 ... x-1]之间。

但是,如果你说的是高效率,那么更有效的方法是创建一维数组并将其增加到它中。这在内存使用(特别是小尺寸)和访问时间方面会更有效。您可以将访问函数包装在网格类中(Grid :: Set(value,x,y),Grid :: Get(x,y))并自行检查大小超出。

//Grid.h
class Grid{
    int maxx, maxy;
    int *array;

  public: 
     Grid(int x, int y);
     ~Grid();
     int Get(int x, int y);
}


// making the grid
Grid::Grid(int x, int y) 
{
    this->maxx= x; 
    this->maxy= y;
    this->array= new int[this->maxx*this->maxy];  
}

// destroying the grid
Grid::~Grid() 
{
    this->maxx= this->maxy= 0;
    delete []this->array;  
    this->array= NULL;
}

// accessing the grid
int Grid::Get(int x, int y)
{
#if DEBUG
    assert(x>=0 && x<this->maxx);
    assert(y>=0 && y<this->maxy);
#endif
    return this->array[ y*this->maxx + x];
}
....