2012-05-11 9 views
1

私はこれに似たクラスを持っている:C++ - メソッドの引数として2次元配列

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

    public: 
     Krzyzowka() { } 

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

は今、私は(メインで宣言):

char array[10][10]; 

とにそれを渡したいです:私はそれをこのようにやっている

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

Krzyzowka obj(array, 10, 10); 

しかし、その後、私は渡された配列でモデル2D配列を設定したい:私はこれを正しく行うことができますどのように

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]’ 

this->model=model; 

しかし、コンパイラは、2つのエラーを返しますか?事前におかげで助けてください。

+0

[10] [10]配列を[40] [40]配列として正しく渡しますか? –

+0

'Krzyzowka'はクロスワードパズルですので、' std :: vector 'を使ってみませんか? –

答えて

0

配列を別の配列に自動的に割り当てる操作はありません。気になる

回避策:


手動(有効nrowsncolsを追跡するために確認してください)ループを使用して、内部の配列にデータをコピーし、割り当てます。の大きさならば

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

:今、あなたのようなオブジェクトを作成することができます

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はネストされた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配列[nrows] [ncols]; char ** model; model = array; 私のコンストラクタプロトタイプは何でしょうか? –

2

パラメータchar model[][40]のみparameter[x][40]ようなアレイを使用することができます。代わりにchar array[x][y]を使用してのオブジェクトをインスタンス化する

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 **パラメータを渡すことができます:あなたは本当にメソッドに任意の行の配列を渡したい場合は

、あなたはポインタを使用することができます。

これでc++を使用しました。あなたは行配列を使用しないほうがいいでしょう。それはevilです。代わりにstl vectorを使うことができます。

あなたに役立つかもしれません:)