在类中动态分配对象指针的2D数组

时间:2016-03-24 09:14:42

标签: c++ arrays qt pointers

我目前在运行时动态分配数组的想法正在挣扎。来自Java,过去只是在类骨架中声明数组,只需要实现中的大小。

这是我发现动态分配2D数组的原因:

Grid.h   
Block** grid;

Grid.cpp
grid = new Block*[size]
for(int i = 0 ; i < size ; i++)
    grid[i] = new Block[size]

这很好用,虽然处理对象我总是被告知使用指向对象的指针而不是存储对象本身是更好的性能。所以,当我试图使数组指针的第二维像这样:

Grid.cpp
grid = new Block*[size]
    for(int i = 0 ; i < size ; i++)
        grid[i] = new Block*[size];

当我将代码更改为此时,出现错误:

error: assigning to 'Block *' from incompatible type 'Block **'; dereference with *
        grid[i] = new Block* [size];
                ^ ~~~~~~~~~~~~~~~~~
                  *

对于C ++的做事方式稍微有点新鲜,有人可以告诉我我做错了什么吗?或者即使我试图完全做错事?

提前致谢!

4 个答案:

答案 0 :(得分:2)

我不建议你写这种类型的代码,但是如果你仍然希望破解你的出路,你可以这样做: -

int main()
{
Block*** grid;      

grid = new Block**[10];         
for(int i = 0 ; i < 10 ; i++)
{       
    grid[i] = new Block*[10];   
}

/*Here, we have created a grid of pointers*/

/*

|Block**[10]|

|Block[0] **|------------->|Block* [10]|
|Block[1] **|------------->|Block* [10]|
|Block[2] **|------------->|Block* [10]|
|Block[3] **|------------->|Block* [10]|
..
..
|Block[9] **|------------->|Block* [10]|

*/

for(int i = 0 ; i < 10 ; i++)
{       
    for(int j = 0 ; j < 10 ; j++)
    {
        grid[i][j] = new Block[10]; 
    }
}

/*

|Block**[10]|

|Block[0] **|------------->|Block* [0]|------------->|Block1|Block2| .. |Block10|
                           |Block* [1]|------------->|Block1|Block2| .. |Block10|
                           |Block* [2]|------------->|Block1|Block2| .. |Block10|
                           ..
                           |Block* [9]|------------->|Block1|Block2| .. |Block10|


|Block[1] **|------------->|Block* [0]|------------->|Block1|Block2| .. |Block10|
                           |Block* [1]|------------->|Block1|Block2| .. |Block10|
                           |Block* [2]|------------->|Block1|Block2| .. |Block10|
                           ..
                           |Block* [9]|------------->|Block1|Block2| .. |Block10|          
|Block[2] **|
|Block[3] **|
..
..
|Block[9] **|

*/
 }

答案 1 :(得分:0)

动态2D数组是指向数组的指针数组。 您应首先初始化指针数组,然后使用循环初始化其他数组。

这里使用int创建一个数组[rowCount] [colCount]:

的例子
int** array = new int*[rowCount];
for(int i = 0; i < rowCount; ++i)
    array[i] = new int[colCount];

否则当然您可以使用以下方法在堆栈上拥有2D数组:

int array[rowCount][colCount];

答案 2 :(得分:0)

使用2d数组的线性表示:

std::unique_ptr<int[]> array(new int[rowCount*colCount]);

for (size_t r = 0; r < rowCount; r++)
  for (size_t c = 0; c < colCount; c++)
    (array.get())[r*colCount + c] = r*c;

答案 3 :(得分:0)

也可以以线程安全的方式完成对指针数组的定位:

size_t allocatedRows = rowCount;
        try{
            array = new char*[allocatedRows];
            while(allocatedRows){
                --allocatedRows;
                array[allocatedRows] = new char[colCount];
            }
        }catch(std::bad_alloc& ex){
            while(++allocatedRows < lines)
                delete array[allocatedRows];
            delete array;
            throw;
        }

上面的代码中有两点需要注意:
1)allocateRows不会在[]运算符中递减,因为行为将是未定义的 2)在分配指针数组之后,解引用数组元素具有未定义的行为(就像没有赋值的普通指针一样)。 还请记住,如果上面的情况我没有从bad_alloc恢复,我只是重新投入,它可以在调用终止之前记录在其他地方。如果您想从其他用户定义的对象创建指针数组,您可以使用std :: uninitialized_copy或std :: uninitialized_fill。 另一种方法是使用矢量。