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

how to declare an array of objects without calling object constructor

本文关键字:对象 情况下 声明 数组 构造函数 调用      更新时间:2023-10-16

给定一个结构体

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;
 }

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

这是一个典型的xy问题——你是在寻求解决方案的帮助,而不是一个问题。真正的问题是,您不想延迟构造函数,而是稍后初始化它。构造和初始化是相关的主题,但不相同。

最好的解决方案是给你的类一个setColorinitialize函数,与构造函数分开。另一种解决方案(更接近你的问题)是声明数组不是对象,而是指针,然后用new Square(WHITE)实例化对象。我更倾向于前者,后者需要更多的生命周期控制和显式删除。

您需要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 

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

此解决方案使用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)};

但是缩放效果不是很好

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

相关文章: