c++ - C ++将抽象类型的动态分配对象传递给函数并存储在向量中
问题描述
在调用方,我想通过流运算符传递特定超类的任意对象:
class SubclassA : public Superclass { ... }
class SubclassB : public Superclass { ... }
...
Container container;
container << SubclassA(param1, param2) << SubclassB(param);
在被调用方,我必须将所有传递的对象存储在向量或列表中:
std::vector<std::unique_ptr<Superclass>> childs;
Container & operator<<(Superclass const & child) {
childs.emplace_back(new Superclass(child)); // not possible, since Superclass is abstract
return *this;
}
有没有可能在被调用方保持所需的行为,避免需要std::unique_ptr
ornew
关键字?
编辑&
:在流运算符参数中添加缺失。
解决方案
您需要添加两件事才能完成这项工作。
首先,operator<<
需要通过引用来获取它的参数。否则你有对象切片。
其次,您需要添加一个由所有派生类实现的虚拟clone
方法。Superclass
此方法将复制自身并返回指向它的指针。
class Superclass {
public:
virtual Superclass *clone() const; // optionally can be abstract
// ...
};
Container & operator<<(Superclass const &child) {
childs.emplace_back(child.clone());
return *this;
}
class SubclassA : public Superclass {
SubclassA *clone() const override {
return new SubclassA(*this);
}
};
这依赖于从指针创建 unique_ptrs。由于这些天不鼓励使用任何类型的原始指针,请参阅此答案以克服智能指针和协变返回类型无法unique_ptr
直接使用和使用的限制。
推荐阅读
- c++ - 你为什么要 =delete 隐式删除的默认构造函数,这有什么意义?
- excel - 如何将多个条件应用于.Find?
- c# - 访问 DbPropertyValues 复杂类型
- reactjs - 在 reactjs 中结合 SimpleBar + Drawer (MaterialUI)
- matlab - 我试图从概率分布中生成两个值,但一个分布没有正确生成值
- javascript - 隐藏错误文本,直到单击框/按钮
- scala.js - 如果使用 scala 函数,scalajs removeEventListener 不起作用
- python - 在 Python 中,如何在循环中对原始类型进行操作?
- postgresql - 列参考 id 不明确 postgres
- pandas - 取熊猫中多个列的平均值