简介
之前遇到了一个难题,在工厂模式中,需要隐藏产品的构造函数,让用户只能通过工厂的函数获取新的产品。但是在返回智能指针时确出现了问题:make_unique和make_shared需要调用产品类的构造函数,但是却不能访问,我在网上找了很久,总算找到了靠谱的方法。
解决方法
不靠谱的方法
第一时间想到的是一个不靠谱的解决方法,把make_unique设成友元类不就行了么?但是,这样最大的问题是,用户也能通过make_unique而不是工厂类构造产品了,这显然没有解决任何问题。
神奇的方法
|
|
在这里可以看到,这里神奇的地方就在于用一个局部类继承产品类,生成一个子类的对象,而子类的智能指针可以自动退化成父类的智能指针。
如果需要把构造函数设为私有而不是保护,则可以将工厂制定为友元类,这里就略过不表了。
总结
C++果然学无止境,这样的代码写出来,我有了一种:“啊哈,我也开始使用黑魔法了!”的感觉。