【问题标题】:How to work with std::make_unique function and interface classes?如何使用 std::make_unique 函数和接口类?
【发布时间】:2017-03-05 15:37:58
【问题描述】:

假设我们要实现策略模式。我们有一个接口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;
}

【问题讨论】:

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


    【解决方案1】:
    Doer doer(std::make_unique<A>()); // or std::make_unique<B>()
    

    以上就差不多了。 std::unique_ptr 非常努力地实现与它所持有的原始指针相同的强制。

    【讨论】:

      【解决方案2】:

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

      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>());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-29
        相关资源
        最近更新 更多