2012-05-11 19 views
1

我有相似類這樣:C++ - 2D陣列作爲一個方法參數

class Krzyzowka 
{ 
    protected: 
    char model[40][40]; 
    int x, y; 

    public: 
     Krzyzowka() { } 

      Krzyzowka(char model[][40], int x, int y) 
      { 
       this->model=model; 
      } 
}; 

現在,我聲明在main():

char array[10][10]; 

並希望將其傳遞到:

Krzyzowka(char model[][40], int x, int y) 

我做這樣說:

Krzyzowka obj(array, 10, 10); 

但後來我想設置的模型二維數組與傳遞的數組:

this->model=model; 

但是編譯器返回兩個錯誤:

error: no matching function for call to ‘Krzyzowka::Krzyzowka(char [10][10], int, int)’ 

error: incompatible types in assignment of ‘char (*)[40]’ to ‘char [40][40]’ 

我怎樣才能正確地做到這一點?預先感謝您的幫助。

+0

說什麼?正確傳遞[10] [10]數組作爲[40] [40]數組? –

+0

'Krzyzowka'是一個縱橫字謎,所以爲什麼不使用'std :: vector '? –

回答

0

沒有可用的操作將數組自動分配給另一個數組。

浮現在腦海中可能的解決方法:


手動使用循環(確保跟蹤有效nrowsncols)的數據複製,分配給您的內部數組。爲了繞過編譯器的投訴,你可以使用模板(假設大小在編譯時已知):

template<int NROWS, int NCOLS> 
    Krzyzowka(char (&model)[NROWS][NCOLS]) 
    { 
     nrows = NROWS > nrows ? nrows : NROWS; 
     ncols = NCOLS > ncols ? ncols : NCOLS; 
     for (int row = 0; row < nrows; row++) 
      for (int col = 0; col < ncols; col++) 
      this->model[row][col] = model[row][col]; 
    } 

現在你可以創建這樣的對象:

char array[][2] = {{'a', 'b'}, {'c', 'd'}}; 
Krzyzowka k(array); 

如果尺寸該陣列僅在運行時已知(例如,基於用戶輸入,並且char** array由嵌套new[]動態分配),則可能需要採用方法given here或切換到以下內容。


更妙的是很可能會使用一些標準數組類型,如std::vector(你可以交換或轉讓)。那麼你對編譯器類型的不兼容性投訴也沒有問題。

std::vector<std::vector<char> > array(nrows, std::vector<char>(ncols)); 
std::vector<std::vector<char> > model; 
model = array; // or model.swap(array); if you don't need the copy 
+0

我真的很想爲模型使用char數組。如果我使用: char array [nrows] [ncols]; char **模型; model = array; 什麼應該是我的構造函數原型? –

2

參數char model[][40]只能爲陣列狀parameter[x][40]使用。

如果你真的想傳遞任何排陣的方法,你可以使用指針:

class Krzyzowka 
{ 
    protected: 
     char **pp_model; 
     int x, y; 

    public: 
     Krzyzowka() { } 

     Krzyzowka(char **pp_model, int x, int y) 
     { 
      this->pp_model = pp_model; 

      // do not miss follow two line 
      this->x = x; 
      this->y = y; 
     } 
}; 

然後,您可以通過char **參數來實例化,而不是使用char array[x][y]的對象。

而現在你使用c++。你最好不要使用行數組。那是evil。你可以使用stl向量。

可能對你有幫助:)