堆上的固定大小的对象和子对象数组

时间:2014-09-17 22:51:47

标签: c++ arrays heap

我已经搜索过并搜索过,但却找不到任何可以解决我的困惑的事情。

我代表一个网格,并有两个类,例如:

class Term {
   ...
};

class GridPoint{
   Term a;
   Term b;
   Term c;
   ...
};

我想在堆上有一个大的固定大小的数组,其中数组的每个元素都是一个GridPoint,它本身包含多个术语。

但是,以下示例将无法编译:

GridPoint* pGrid = new GridPoint[100][100];

根据gcc:

  

错误:初始化时无法将'GridPoint(*)[100]'转换为'GridPoint *'

1 个答案:

答案 0 :(得分:-1)

首先,我想在现代C ++中使用newdelete建议,而是使用智能指针或标准库中的容器将其封装为例如std::vector

话虽这么说,为了让你的例子工作,你必须在循环中初始化一个数组数组,如下所示:

GridPoint** pGrid = new GridPoint*[100];
for (std::size_t i = 0; i != 100; ++i) {
    pGrid[i] = new GridPoint[100];
}

// Do something...

for (std::size_t i = 0; i != 100; ++i) {
    delete[] pGrid[i];
}
delete[] pGrid;

要获得更好的选择,只需使用std::arraystd::vector

std::array<std::array<GridPoint, 100>, 100> pGrid;

注意: std::array封装了一个用于存储数据的静态数组。这意味着如果您分配具有自动存储持续时间的std::array对象,则其数据将被动态分配(数据将不在“堆”上)。

然而,

std::vector将使用动态分配来存储其数据。