假设我们要实现策略模式。我们有一个Base
接口(interface)和两个派生类-A
和B
。 Doer
类的实例可以在A
和B
的方法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>());