C++ 声明头中没有大小的动态数组,在.cpp中定义

C++ 声明头中没有大小的动态数组,在.cpp中定义,c++,dynamic-arrays,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]; } a

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

//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=newint*[x];

对于(i=0;i是的,您的方法是有效的和高效的。您(显然)唯一的问题是确保您没有超过限制(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];
}
....
//Grid.h
类网格{
int-maxx,maxy;
int*数组;
公众:
网格(整数x,整数y);
~Grid();
int-Get(int-x,int-y);
}
//制作网格
网格::网格(整数x,整数y)
{
这->maxx=x;
此->最大y=y;
this->array=newint[this->maxx*this->maxy];
}
//破坏电网
网格::~Grid()
{
this->maxx=this->maxy=0;
删除[]此->数组;
这个->数组=NULL;
}
//访问网格
int-Grid::Get(intx,inty)
{
#如果调试
断言(x>=0&&xmaxx);
断言(y>=0&&ymaxy);
#恩迪夫
返回此->数组[y*this->maxx+x];
}
....

+1使对象负责访问和存储…也就是说,使数组私有,并使您的Get/Set访问方法。这样,您可以更改存储实现,而不更改其余代码。不必担心访问方法的效率…它将由编译器/链接器内联到您的代码中,我如果范围检查结果过于昂贵,您可以再次删除它,而无需更改代码的其余部分…不要忘了三条规则!非常好的解释,谢谢。Anbyody想解释一维数组和二维数组在性能/访问时间上的差异吗?您的解决方案需要获取临时指针才能到达最终结果(第二个dim阵列)。(a)使用偏移量x从阵列读取内存。(b)使用偏移量y从结果(a)读取内存以获取实际数据。根据阵列的大小,子阵列可以分散在内存中的所有位置。另一种解决方案可以在寄存器中计算目标地址,并且只有一个内存访问。(a)使用偏移量x*y.Oh从地址数组获取内存,顺便说一句,除非在紧循环中进行大量网格访问,否则速度优势是微乎其微的。