如何在不调用对象构造函数的情况下声明对象数组
how to declare an array of objects without calling object constructor
给定一个结构体
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问题——你是在寻求解决方案的帮助,而不是一个问题。真正的问题是,您不想延迟构造函数,而是稍后初始化它。构造和初始化是相关的主题,但不相同。
最好的解决方案是给你的类一个setColor
或initialize
函数,与构造函数分开。另一种解决方案(更接近你的问题)是声明数组不是对象,而是指针,然后用new Square(WHITE)
实例化对象。我更倾向于前者,后者需要更多的生命周期控制和显式删除。
您需要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
如果你不想使用默认构造函数,你可以使用你已有的构造函数。
此解决方案使用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)};
但是缩放效果不是很好
创建一个(智能)指针数组而不是数组。指针的一个用途是使对象可以在以后初始化。
相关文章:
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 在这种情况下,java对象是否可以调用本机函数
- 如何在没有数据拷贝的情况下从指针创建一个Eigen VectorXd对象
- 在不复制临时对象的情况下延长其生存期
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 如何在不销毁对象的情况下返回对象列表
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 在没有默认构造函数的情况下创建的派生对象
- 如何在不使用new的情况下保持在其他对象中创建的对象存活?
- 如何在没有 std::move 的情况下移动临时对象
- 如何在不复制的情况下操作 QByteArray 对象?
- 在单元测试中,如何在不使用 operator== 的情况下比较两个对象,这可能会错过新成员?
- 如何在不使用 "new" 关键字的情况下解除分配创建的对象的内存?
- 如何防止类中的类对象尝试在没有默认构造函数的情况下自动构造自身?
- 在没有堆的情况下用两种方法构造对象
- 我们可以在没有新实例化的情况下声明一个抽象方法来返回抽象超类中的子类对象吗
- C ++:如何在不创建对象的情况下在主函数中调用方法
- 在不放置新运算符的情况下,在预分配的内存上使用虚函数初始化对象 - 这可能吗?如果没有,为什么