如何处理抽象对象的返回

时间:2015-03-13 16:58:51

标签: c++ pointers reference abstract-class return-value

我面临以下情况:

 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()返回一个Base类型。我知道我可以使用指针或引用使编译器满意,但由于对象ConcreteA是在exec()中创建的,因此按值返回是避免悬挂引用或指向未定义所有权的最佳方法。

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

1 个答案:

答案 0 :(得分:3)

这看起来像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();
}

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

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