【问题标题】:std::make_shared an interface?std::make_shared 接口?
【发布时间】:2021-06-05 17:11:18
【问题描述】:

我有一个继承自 IComponent 的 Component 类。该函数将一个组件与另一个组件链接起来。

    void Component::link(IComponent &other)
    {
        components->setRef(std::make_shared<IComponent>(other));
    }

当我编译我的程序时出现这个错误:

error: invalid new-expression of abstract class type ‘IComponent’

我该如何解决这个问题?

PS:我知道我不能实例化一个接口,因为她包含纯虚函数,但我不知道如何避免这个问题

【问题讨论】:

  • make_shared 创建一个对象的新实例,这不是你想要的。 Component::link 应该接收 shared_ptr&lt;IComponent&gt; 作为参数。
  • other 来自哪里?您的意思是将其所有权转让给shared_ptr?如果是这样,将其通过右值 ref 直接传递给setRef
  • 我明白了,但是我的老师正在强加函数的原型
  • 通常你会在你的接口中添加一个纯虚拟的clone 方法并在派生类中实现它
  • 感谢它的工作!

标签: c++ interface


【解决方案1】:

目前还不清楚你想在这里做什么。 “setRef()”听起来它的参数是一个引用,如果是这样,你不需要对(智能)指针做任何事情。您至少应该展示该方法的原型。

如上所述,如果您想“复制”“其他”,您应该通过“克隆”界面来完成,例如创建虚拟“IComponent* IComponent::clone()”方法并在 Component 中正确实现它。 此外,如果保证“其他”是对 Component 的引用,您可以强制转换和复制构建新实例(但这不太可能是您的老师希望您做的)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    相关资源
    最近更新 更多