如何在不调用对象构造函数的情况下声明对象数组

时间:2013-05-25 12:23:42

标签: c++

给出类似

的结构
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 个答案:

答案 0 :(得分:4)

您误解了构造函数的要点,即确保对象在其整个生命周期中始终初始化且有效。因此,构造函数的调用不能以任何方式延迟或推迟。

这是一个典型的XY-problem - 你要求有关预期解决方案的帮助,而不是问题。真正的问题是你不想推迟构造函数,但稍后会初始化它。构造和初始化是相关的主题,但不完全相同。

最佳解决方案是为您的班级提供setColorinitialize功能,与构造函数分开。另一种解决方案(更接近您的问题)是将数组声明为对象,而不是指针,然后使用new Square(WHITE)实际实例化对象。我会选择第一个,第二个需要更多生命周期控制并明确删除。

答案 1 :(得分:1)

您需要一个Square的默认构造函数,它可以在没有参数的情况下调用。例如:

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

否则,您应该稍后使用指向Squarenew的指针。例如:

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)

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