给出类似
的结构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;
}
答案 0 :(得分:4)
您误解了构造函数的要点,即确保对象在其整个生命周期中始终初始化且有效。因此,构造函数的调用不能以任何方式延迟或推迟。
这是一个典型的XY-problem - 你要求有关预期解决方案的帮助,而不是问题。真正的问题是你不想推迟构造函数,但稍后会初始化它。构造和初始化是相关的主题,但不完全相同。
最佳解决方案是为您的班级提供setColor
或initialize
功能,与构造函数分开。另一种解决方案(更接近您的问题)是将数组声明为对象,而不是指针,然后使用new Square(WHITE)
实际实例化对象。我会选择第一个,第二个需要更多生命周期控制并明确删除。
答案 1 :(得分: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
答案 2 :(得分:1)
如果您不想使用默认构造函数,可以使用已有的构造函数。
此解决方案使用std::vector
,我建议您使用它。
std::vector<Square> myVector( ROWS*COLS, Square(WHITE) );
这将创建一个ROWS * COLS
元素数组,每个元素都初始化为Square(WHITE)
的值。
您可以创建一个Board
类,它在内部使用这样的向量,并提供功能,例如初始化任意大小的板,并根据行和列信息索引线性向量中的Square。
你也可以这样做:
方板[2] [2] = {方形(白色),方形(白色),方形(白色),方形(白色)};
但实际上并没有很好地扩展。
答案 3 :(得分:0)
创建一个(智能)指针数组而不是数组。指针的一个目的是可以在以后初始化对象。