我想通过初始化列表初始化指向基类的指针数组,为其提供派生类对象的地址。
King king{square};
Queen queen{square};
Rook rook{square};
Piece* pieces[] = {&king, &queen, &rook};
理想情况下,我希望拥有
Piece* pieces[] = {
&King{square},
&Queen{square},
&Rook{square}
};
但是我不能使用临时对象的地址。
有没有一种简洁的方法可以直接在初始化列表中编写构造函数?
最佳答案
考虑使用new
返回指向堆分配对象的指针的运算符,因此您的对象不再是临时值。
Piece* pieces[] = {
new King{square},
new Queen{square},
new Rook{square}
};
但是你必须打电话delete
在删除数组之前对数组中的每个项目进行处理,这样就不会出现内存泄漏。
我建议使用 shared pointers (或唯一指针),并使您的数组成为共享指针数组,并使用 make shared而不是 new
,因此您不必担心内存泄漏。
std::shared_ptr<Piece> pieces[] = {
std::make_shared<King>(square),
std::make_shared<Queen>(square),
std::make_shared<Rook>(square)
};
关于c++ - 使用新构造的派生对象的地址初始化基类数组的巧妙方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70721590/