c++ - 使用新构造的派生对象的地址初始化基类数组的巧妙方法

标签 c++ arrays

我想通过初始化列表初始化指向基类的指针数组,为其提供派生类对象的地址。

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/

相关文章:

ios - 从 JSON 响应中创建一个数组

java - 友元数组递归

c++ - 与 std::conditional_variable::wait() 一起使用时 std::unique_lock 的作用是什么

c++ - 解引用指向 union 成员的指针

c++ - 从磁盘读取图像文件时出错

java - 泛型和数组

javascript - 平均二维数组中的连续值对

c++ - 堆分配的对象构造函数

C++游戏对按键没有时间响应

c++ - 空终止字符 (\0) 和 `^@` 之间的区别