[英]Dynamically allocating a 2D array of object pointers in a class
我目前正在為在運行時動態分配數組的想法而苦苦掙扎。 來自Java,過去只在類骨架中聲明數組,在實現中只需要大小。
這是我發現動態分配二維數組的方法:
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++ 的做事方式有點陌生,有人能告訴我我做錯了什么嗎? 或者即使我試圖完全做錯事?
提前致謝!
我不建議你寫這種類型的代碼,但如果你仍然想破解你的出路,你可以做這樣的事情:-
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] **|
*/
}
動態二維數組是指向數組的指針數組。 您應該首先初始化指針數組,然后使用循環初始化其他數組。
這是一個使用 int 創建數組 [rowCount][colCount] 的示例:
int** array = new int*[rowCount];
for(int i = 0; i < rowCount; ++i)
array[i] = new int[colCount];
否則當然你總是可以通過使用在堆棧上有一個二維數組:
int array[rowCount][colCount];
使用二維數組的線性表示:
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;
分配指針數組也可以以線程安全的方式完成:
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) 分配行在 [] 運算符中不會遞減,因為行為將是未定義的
2) 分配指針數組后,解引用數組元素有未定義的行為(就像沒有賦值的普通指針一樣)。 還請記住,在上述情況下,我沒有從 bad_alloc 中恢復,我只是重新拋出,它可以在調用終止之前記錄在其他地方。 如果您想從其他用戶定義的對象創建指針數組,您可以使用 std::uninitialized_copy 或 std::uninitialized_fill。 另一種方法是使用向量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.