如何处理 return 个抽象对象

How to handle return of Abstract Objects

我面临以下情况:

 class Base{
      virtual void Stuff() = 0;
 };

 class ConcreteA : public Base{
      void Stuff() {};
 };

 class ConcreteB : public Base{
      void Stuff() {};
 };

 class Context {
      Base exec() {
           ConcreteA conc_a();
           return a;
      }
 };

当然,编译器会给我一个错误,因为 Base 是抽象的。但是,我需要 exec() return 一个 Base 类型。我知道我可以使用指针或引用让编译器满意,但由于对象 ConcreteA 是在 exec() 中创建的,return 按值是避免悬空引用或具有未定义所有权的指针的最佳方法。

有没有办法避免使用指针或引用来处理这种情况?

这看起来像是 std::unique_ptr 的一个完美、简单的用例。这是一个 C++14 示例:

#include <memory>
#include <iostream>

class Base{
public:
      virtual ~Base() {}
      virtual void Stuff() = 0;
};

class ConcreteA : public Base{
      void Stuff() { std::cout << "ConcreteA::Stuff\n"; };
};

class ConcreteB : public Base{
      void Stuff() { std::cout << "ConcreteB::Stuff\n";};
};

class Context {
public:
      std::unique_ptr<Base> exec() {
           return std::make_unique<ConcreteA>();
      }
};

int main()
{
    Context c;
    auto base_ptr = c.exec();
    base_ptr->Stuff();
}

main 中的 base_ptr 超出范围时,内存将自动删除。

请注意,我还使 Base 析构函数成为虚拟的。也许您只是为了简洁而在代码示例中将其遗漏了,但应该强调它的重要性,我认为即使在简短的示例代码中也应该保留它。