假设我们要实现策略模式。我们有一个Base接口(interface)和两个派生类-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;
}

最佳答案

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

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

08-19 15:17