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_ptrnew 关键字?

编辑: 在流运算符参数中添加缺少的&amp;

【问题讨论】:

您总是可以使用std::shared_ptrstd::make_shared 或者在您显示std::make_unique 的情况下,对吗?或者你想避免智能指针? 如果可能,我想完全避免使用智能指针,但仅限于在调用方。由于这个流函数被非常频繁地调用,如果我可以像示例中所示传递原始对象,它会更干净。 @NutCracker 使用shared_ptr unique_ptr 就足够了总是一个坏主意。 @JaMiT,虽然引用问题的答案与此答案相同,但问题仍然有很大不同。恕我直言,这两个问题没有重复。 【参考方案1】:

您需要添加两件事来完成这项工作。

首先,operator&lt;&lt;需要通过引用获取其参数。否则你有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 ++将抽象类型的动态分配对象传递给函数并存储在向量中[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将环境变量存储在动态分配的数组中

C++Primer 第十五章

C++ 类型将基础对象转换为派生对象

通过指针将堆栈分配的对象传递给在另一个线程上执行的函数

C ++将多个对象传递给线程中的函数

C ++将一个对象传递给另一个对象?