2012-03-21 127 views
2

我試圖做一個動態分配的具有可變大小的二維數組,但我不知道爲什麼如果我創建自己的常量值它不會編譯:在C++中的一個類的方法中傳輸動態分配的矩陣

const int oConstanta=N+1; 

    int (*m)[oConstanta]=new int[oConstanta][oConstanta]; 

但是,當我使用一個正常的常量,如括號之間的1000,它編譯成功。

const int oConstanta=N+1; 

    int (*m)[1000]=new int[1000][1000]; 

有沒有人知道這個的原因?

PS:我知道:

int **m=new int*[oConstanta]; 

    for(i=1;i<=N;i++) 
    { 
     m[i]=new int[oConstanta]; 
     init(m[i]); 
    } 

能解決我的問題,但我想了解爲什麼我以前的方法是一個壞主意。

+0

第一個不是標準的C++。 – 2012-03-21 20:10:27

+1

什麼是'N'? @smarinov:取決於'N',是的。 – 2012-03-21 20:11:12

+1

請勿使用指針。改用'std :: vector >',最好寫一個包裝類'Matrix'。 – 2012-03-21 20:11:18

回答

1

除非N是編譯時間常量表達式,oConstanta是不是編譯時間常數任一。

製作一個兩維陣列中的C++的最好的辦法是使用std::vectorstd::vector S,例如,像這樣:

#include <vector> 

std::vector<std::vector<int> > m(N+1, std::vector<int>(N+1, 0)); 
0

最終的原因是,你不能創建變量的靜態數組長度。

在你的代碼中,你正試圖創建一個動態數組的靜態數組,這兩個變量的長度都是可變的。

現在,靜態數組存在堆棧中,而動態數組存在堆中。雖然堆的內存管理是「靈活的」,但堆棧卻不同:編譯器需要能夠確定堆棧中每個幀的大小。如果你使用一個可變長度的數組,這顯然是不可能的。另一方面,如果你使用一個指針,棧幀的大小是已知的(一個指針已知大小)並且一切都很好。

如果您想嘗試,因爲它是一個固定大小的靜態數組,其條目是動態分配的變長數組(允許)這應該編譯罰款

int (*m)[1000]=new int[oConstanta][1000] 

簡而言之:只要在編譯時不知道對象的大小,該對象就不能在堆棧中,它必須被動態分配。

0

爲了與鄰接的元件和單個分配動態分級,2D矩陣:

std::vector<int> matrix(Rows*Columns); 

訪問在行第Ĵ列的元素:

matrix[Columns*i + j] = 1; 

你可以將它們全部包裝在一個類中。這裏有一個非常基本的例子:

struct Matrix { 
    std::vector<int> m; 
    size_t rows,columns; 

    Matrix(size_t rows,size_t columns) 
     : rows(rows) 
     , columns(columns) 
     , m(rows*columns) 
    {} 

    int &at(size_t i,size_t j) { 
     return m.at(i*columns + j); 
    } 
};