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

Declaring a dynamic array without size in header, defining in .cpp

本文关键字:动态 数组 定义 cpp 一个 声明 文件      更新时间:2023-10-16

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

中声明它
//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代码。

是的,你的方法是有效和高效的。你唯一的问题(很明显)是确保你没有超过限制(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];
}
....