如何使用std :: make_unique函数和接口类?

时间:2016-10-23 22:53:34

标签: c++ inheritance interface abstract-class unique-ptr

假设我们想要实施战略模式。我们有一个接口Base和两个派生类 - ABDoer班级的实例可以在AB的方法do()之间进行选择。问题是如何完成代码以实现它应该如何。

class Base {
  virtual void do() const = 0;
};

class A: public Base {
  void do() const override {};
};

class B: public Base {
  void do() const override {};
}

class Doer {
  public:
    Doer(std::unique_ptr<Base> b_ptr) : ptr(b_ptr) {}
    void do() const { ptr->do(); }
  private:
    std::unique_ptr<Base> ptr;
}

int main() {
  Doer doer(std::unique_ptr<Base>());
  doer.do();
  return 0;
}

2 个答案:

答案 0 :(得分:4)

Doer doer(std::make_unique<A>()); // or std::make_unique<B>()

以上几乎就是这样。 std::unique_ptr非常努力地实现与它所拥有的原始指针相同的强制。

答案 1 :(得分:3)

您的代码存在三个主要问题。

1)do是该语言的关键字。您不能将其用作标识符(如函数名称)

2)你按值b_ptr取值,所以你需要离开它:

Doer(std::unique_ptr<Base> b_ptr) : ptr(std::move(b_ptr)) {}

3)您将空unique_ptr传递给Doer的构造函数,这相当于传递nullptr。您还尝试实例化基类。这是不可能的,因为Base是一个纯虚拟类。将make_unique与派生类型一起使用:

Doer doer(std::make_unique<A>());