0

次のような構造体が与えられた場合

struct Square
{
  Square(Color p_color): color_(p_color) {}
  Color color_;
 };

2 次元配列を宣言して後で初期化する方法を教えてください。例えば、

typedef Square (&Square8x8)[8][8];

Square8x8 initSquares()
{
    Square board[ROWS][COLS]; //declare the array

    for(int row=0;row<ROWS;row++)
            for(int col=0;col<COLS;col++)
            {
                    if(col%2 == 0)
                            board[row][col]= Square(WHITE); //actual initlization
                    else
                            board[row][col] = Square(BLACK);
            }
    return board;

 }
4

4 に答える 4

4

ライフサイクル全体でオブジェクトが常に初期化され、有効であることを保証するコンストラクターのポイントを誤解しています。したがって、コンストラクターの呼び出しを遅らせたり延期したりすることはできません。

ただし、これは典型的なXY 問題です。問題ではなく、意図した解決策について助けを求めているのです。本当の問題は、コンストラクターを延期したくないが、後で初期化することです。構築と初期化は関連する主題ですが、同一ではありません。

最善の解決策は、コンストラクターとは別に、クラスにsetColorまたは関数を与えることです。initialize別の解決策(あなたの質問に近い)は、配列をオブジェクトとしてではなくポインタとして宣言し、後でオブジェクトを実際にインスタンス化することnew Square(WHITE)です。私は最初のものを選びますが、2番目は明示的な削除を伴うより多くのライフサイクル制御を必要とします。

于 2013-05-25T12:31:35.283 に答える
1

デフォルトのコンストラクターを使用したくない場合は、既に持っているコンストラクターを使用できます。

このソリューションではstd::vectorを使用します。これも使用することをお勧めします。

std::vector<Square> myVector( ROWS*COLS, Square(WHITE) );

ROWS * COLSこれにより、要素の配列が作成され、それぞれが の値に初期化されますSquare(WHITE)

Board内部でそのようなベクトルを使用し、任意のサイズのボードを初期化し、行と列の情報に基づいて線形ベクトルで正方形にインデックスを付けるなどの機能を提供するクラスを作成できます。

次のこともできます。

Square board[2][2] = {Square(WHITE), Square(WHITE), Square(WHITE), Square(WHITE) };

しかし、実際にはうまくスケーリングしません。

于 2013-05-25T12:40:55.200 に答える
1

Squareパラメータなしで呼び出すことができるデフォルトのコンストラクタが必要です。例えば:

struct Square
{
  Square() {}  // <------------------------- For example
  Square(Color p_color): color_(p_color) {}
  Color color_;
};

それ以外の場合は、後でそれらへのポインターを使用する必要がSquareありnewます。例えば:

struct Square
{
  Square(Color p_color): color_(p_color) {}
  Color color_;
};
const int ROWS = 8;
const int COLS = 8;

この場合、ポインタを使用する必要があります。

std::unique_ptr<Square> board[ROWS][COLS];

for (int i=0; i<ROWS; i++)
    for (int j=0; j<COLS; j++)
        board[i][j] = std::unique_ptr<Square>(new Square(RED));

または (裸のポインターの場合)

Square* board[ROWS][COLS];

for (int i=0; i<ROWS; i++)
    for (int j=0; j<COLS; j++)
        board[i][j] = new Square(RED);

....
// Be careful, you should delete them all 
于 2013-05-25T12:25:10.990 に答える
0

配列の代わりに (スマート) ポインターの配列を作成します。ポインターの目的の 1 つは、後でオブジェクトを初期化できるようにすることです。

于 2013-05-25T12:33:10.353 に答える