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

How to work with std::make_unique function and interface classes?

本文关键字:函数 接口 unique 何使用 std make      更新时间:2023-10-16

假设我们要实现策略模式。我们有一个接口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;
}
Doer doer(std::make_unique<A>()); // or std::make_unique<B>()

以上就是它。std::unique_ptr非常努力地实现与它持有的原始指针相同的强制转换。

你的代码有三个主要问题:

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

2)你用b_ptr的值,所以你需要从它移动:

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

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

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