0

给定一个类似的结构

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

我如何声明一个二维数组并稍后对其进行初始化。例如,

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 问题- 您正在寻求有关预期解决方案的帮助,而不是问题。真正的问题是您不想推迟构造函数,而是稍后对其进行初始化。构造和初始化是相关的主题,但并不完全相同。

最好的解决方案是给你的类一个setColorinitialize函数,与构造函数分开。另一种解决方案(更接近您的问题)是将数组声明为不是对象,而是指针,然后稍后使用new Square(WHITE). 我会选择第一个,第二个需要更多的生命周期控制和显式删除。

于 2013-05-25T12:31:35.283 回答
1

如果您不想使用默认构造函数,则可以使用已有的构造函数。

此解决方案使用std::vector,我也建议您使用。

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

这将创建一个元素数组ROWS * COLS,每个元素都初始化为Square(WHITE).

您可以创建一个Board类,该类在内部使用这样的向量并提供一些功能,例如初始化任意大小的板并根据行和列信息在线性向量中索引 Square。

你也可以这样做:

方板[2][2] = {正方形(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

创建一个(智能)指针数组而不是数组。指针的一个目的是使对象可以稍后被初始化。

于 2013-05-25T12:33:10.353 回答