2013-09-28 37 views
0

我有一個類需要有一個二維數組,我可以在構造時通過傳遞兩個參數來初始化它。你如何在一個類中聲明一個二維動態數組。如何在C++中聲明一個類中的二維動態數組

class Life 
{ 
public: 
    Life (int rows, int cols); 
    ~Life(); 
    Life(const Life& orig); 
    Life& operator=(const Life& rhs); 

    void init(); 
    void print(); 
    void update(); 
    void instructions(); 
    bool user_says_yes(); 
private: 
    int rows; 
    int cols; 

    int neighbor_count(int row, int col); 
    int** grid; 
}; 

Life::Life(int row, int col) 
{ 
    rows = row; 
    cols = col; 
    grid = new [rows][cols]; 
} 

我知道數組有問題,因爲在構造函數中它說它應該是一個常量值。但在用戶輸入值之前我不會知道這個值。但不知何故,我需要在這個類中有一個數組,將動態創建到指定的大小。現在我不能使用矢量,但是如果你知道如何使它與矢量一起工作,它可能會幫助其他人。

+0

使用'std :: vector' – Kal

+0

@Kal哦哇,這就像超級有用,特別是在OP明確表示他知道矢量但現在不能使用它們! – us2012

+0

@ us2012我們歡迎 – Kal

回答

1

我是這樣做的:

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

第一行初始化一個數組,這將包含總共指針,然後將每個這些指針的被分配給保存總共COLS整數。 而在你的析構函數:

for(int i=0;i<rows;i++){ 
     delete[] grid[i]; 
} 
delete[] grid; 

在這裏,你必須先回收行,因爲電網被存儲的地址,先刪除它會導致你失去他們。

請記住,如果您複製此類的一個對象,您也需要爲該副本進行此初始化。這包括=運算符和複製構造函數。

+0

+1但是OP也必須在複製和分配操作中也做同樣的事情。還要解釋一下當前的代碼在做什麼。這對未來的任何幫助,而不僅僅是發佈代碼。 – Mahesh

+0

這是正確的。將它添加到答案 – memo1288

+0

我以前見過這個,但最後用你的描述來閱讀它是非常有意義的。我要去嘗試一下。更新函數必須聲明另一個二維數組,以便從網格中複製所有內容,所以我也必須在此處執行此操作。 – Alex

0

你是對的,你應該使用矢量的載體。但由於你不能...

有兩種方法來做二維向量。首先是創建一維矢量,並在訪問它時將這兩個維度壓縮成一個。如果您想將其視爲二維,則可以將它放在類方法後面。 grid = new int[rows*cols]; grid[c*rows+r]

第二種方法是製作一個指針數組,其中每個指針是一行的一維數組。您需要分別分配所有行指針。