1

したがって、クラスのヘッダーファイルで、Foo次のようにintの2D配列を宣言します。

int board[][];

コンストラクターでサイズを設定したいので、意図的にサイズを省略しています。board[][]初期化されるとサイズは変更されません。私のコンストラクターの1つは次のようになります。

Foo(int _board[][]);

board[][]ここでは、同じサイズに設定し_board[][]、内容もコピーしたいと思います。私はこれを.cppの実装で使用してみましたFoo

Foo::Foo(int _board[][]){
board[][] = _board[][]; //Does not work as intended
}

ただし、これは意図したとおりに機能しません。コンストラクターboard[][]と同じサイズで同じ内容にする方法を教えてください。_board[][]

4

1 に答える 1

1

C++はJavaとは異なります。int a[][];変数型としては許可されていません。誤解を招くC++の機能のいくつかは、最初のサイズを空のままにしておくことができるということです。

int foo(int a[]);
int foo(int a[][3]); 
int foo(int a[][3][4]); 

もう1つの誤解を招くC++機能は、これが配列の初期化で許可されていることです(コンパイラーはサイズをカウントします)。

int a[][] = {{1,2}, {1,2,3,4}, {1}};

これは次と同等です:

int a[3][4] = {{1,2}, {1,2,3,4}, {1}};

あなたの場合-std::vector:を使用してください

std::vector<std::vector<int>> board;
Foo(std::vector<std::vector<int>> board) : board(board) {}

何らかの理由でstd::vectorを使用できない場合、唯一の解決策はint**両方のサイズで使用することです。

int** board;
size_t s1;
size_t s2;
Foo(int** board = NULL, size_t s1 = 0, size_t s2 = 0) : board(board), s1(s1), s2(s2) {}

ただし、この方法は使用できないことに注意してください。

int board[][] = {{1,1,2},{1,2,2}};
Foo foo((int**)board,2,3);

動的配列を提供する必要があるため:

int** board = new int*[2] { new int[3]{1,1,2}, new int[3]{1,2,2}};

それ以来、コピーコンストラクタ、代入演算子、デストラクタを実装する必要があります。

Foo(const Foo& other) : TODO { TODO }  
~Foo() { TODO }  
Foo& operator = (Foo other) { TODO }

したがって、std::vectorを使用するだけです。

于 2012-10-28T22:55:17.697 に答える