如何使用std::make_unique函数和接口类
How to work with std::make_unique function and interface classes?
假设我们要实现策略模式。我们有一个接口Base
和两个派生类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;
}
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_ptr
给Doer
的构造函数,这相当于传递一个nullptr
。您还可以尝试实例化基类。这是不可能的,因为Base
是一个纯虚拟类。使用make_unique
和派生类型:
Doer doer(std::make_unique<A>());
相关文章:
- 内联如何影响模块接口中的成员函数
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- unique_ptr实现接口时对已删除函数的引用
- 在多个头文件中从接口声明被覆盖的函数时,如何避免重复代码?
- 如何通过接口将函子分配给函数对象
- 如何创建一个接口,允许我访问C++中的按钮(和其他ui)函数,该函数是使用python中的MFC实现的
- C++接口的工厂函数实现
- 对已定义的接口析构函数的未定义引用
- 必须具有泛型接口的函数,但必须根据传递的子类(不知道它们是什么!)以不同的行为 - C++
- 在构造函数处将类对象强制转换为接口始终返回 NULL
- 在接口文件中使用模板时出现"not a type"错误的函数指针
- 从 COM 接口中的函数返回多个值
- 为什么在将多态行为与指向接口的指针一起使用时没有调用析构函数?
- 这是重载提供与非静态成员函数相同接口的静态成员函数的优雅方法吗?
- 从多个不同的实现类 c++ 调用接口函数
- 单冒号是什么意思 c++ 函数接口
- 编写现代函数接口以"produce a populated container"
- 为什么std::vector的构造函数接口在C++11中发生了变化
- 传递函数接口函数的指针
- 为什么shared_ptr无法解析函数接口中的继承关系?