如何使抽象类正确返回另一个抽象类的具体实例?

Cha*_*les 0 c++ abstract-class interface

我最近重新编写了一个自己的库来尝试将接口与实现分离.我在最后一个问题上遇到了一个用于返回另一个类的实例的类.

在接口定义中,我做了类似的事情

struct IFoo
{
    virtual const IBar& getBar() = 0;
}
Run Code Online (Sandbox Code Playgroud)

然后在具体的Foo getBar看起来像

const IBar& Foo::getBar()
{
    Bar ret = Bar();
    return ret;
}
Run Code Online (Sandbox Code Playgroud)

问题是,一旦getBar完成就会删除ret,当复制构造函数试图像这样使用Bar时会导致严重崩溃

const Bar myBar = myFoo.getBar();
Run Code Online (Sandbox Code Playgroud)

我一直在阅读各种各样的东西,我知道通过引用返回是不受欢迎的,但我没有看到任何其他方式(我不想返回Bar*因为我不想手动删除返回值).

抽象类返回从另一个抽象类派生的具体类的实例的正确方法(如果存在任何方式)是什么?

注意我确实看到了这个解决方案:从函数返回一个抽象类, 但我不想让返回值静态和松散线程安全.

Sch*_*ron 8

使用智能指针.这些指针在不再使用时被删除(参见例如http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/smart_ptr.htm).

  • 一个......聪明的主意?;-) (2认同)
  • 我认为你应该考虑使用智能指针,然后才能在整个地方使用它们.这个博客是关于这个主题及其如何被轻易过度使用的有趣读物:http://www.bureau14.fr/blogea/index.php/2009/08/smart-pointers-are-overused/ (2认同)