C ++将抽象类型的动态分配对象传递给函数并存储在向量中[重复]
Posted
技术标签:
【中文标题】C ++将抽象类型的动态分配对象传递给函数并存储在向量中[重复]【英文标题】:C++ Pass dynamic allocated objects of abstract type to function and store in vector [duplicate] 【发布时间】:2020-04-29 16:25:49 【问题描述】:在调用方,我想通过流运算符传递特定超类的任意对象:
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
或 new
关键字?
编辑:
在流运算符参数中添加缺少的&
。
【问题讨论】:
您总是可以使用std::shared_ptr
和std::make_shared
或者在您显示std::make_unique
的情况下,对吗?或者你想避免智能指针?
如果可能,我想完全避免使用智能指针,但仅限于在调用方。由于这个流函数被非常频繁地调用,如果我可以像示例中所示传递原始对象,它会更干净。
@NutCracker 使用shared_ptr
unique_ptr
就足够了总是一个坏主意。
@JaMiT,虽然引用问题的答案与此答案相同,但问题仍然有很大不同。恕我直言,这两个问题没有重复。
【参考方案1】:
您需要添加两件事来完成这项工作。
首先,operator<<
需要通过引用获取其参数。否则你有object slicing。
其次,您需要在Superclass
中添加一个虚拟的clone
方法,该方法由所有派生类实现。该方法会复制自身并返回指向它的指针。
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。由于现在不鼓励使用任何类型的原始指针,请参阅 this answer 以了解克服智能指针和协变返回类型无法相处的限制并直接使用 unique_ptr
的方法。
【讨论】:
谢谢!第一个问题是一个错字,第二个解决方案非常适合。以上是关于C ++将抽象类型的动态分配对象传递给函数并存储在向量中[重复]的主要内容,如果未能解决你的问题,请参考以下文章