c++ - 如何处理抽象对象的返回

标签 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() 中创建的,按值返回是避免悬空引用或具有未定义所有权的指针的最佳方法。

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

最佳答案

这看起来像是 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 析构函数设为虚拟。也许您只是为了简洁而在代码示例中将其遗漏了,但应该强调它的重要性,我认为即使在简短的示例代码中也应该保留它。

关于c++ - 如何处理抽象对象的返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29037921/

相关文章:

将 C 字符串转换为全低

reference - 部署 ClickOnce 时缺少 dll

c++ - 继承、指针和软件架构

c++ - while 循环接受第一个和第二个 cin 的输入

javascript - 编写 ASYNC CPP nodejs (0.5.3+) 模块

rust - 如何处理 Option<Ref<T>> 和 Option<&T>

Ruby 通过引用更改哈希值

c++ - 二维字符数组中的字符设置不正确

C++删除二维指针 vector

c - 使用 fread 将文件的一部分读取到缓冲区