[C++技巧] 在私有构造函数类上使用make_unique

简介

  之前遇到了一个难题,在工厂模式中,需要隐藏产品的构造函数,让用户只能通过工厂的函数获取新的产品。但是在返回智能指针时确出现了问题:make_unique和make_shared需要调用产品类的构造函数,但是却不能访问,我在网上找了很久,总算找到了靠谱的方法。

解决方法

不靠谱的方法

  第一时间想到的是一个不靠谱的解决方法,把make_unique设成友元类不就行了么?但是,这样最大的问题是,用户也能通过make_unique而不是工厂类构造产品了,这显然没有解决任何问题。

神奇的方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class ProductA
{
protected:
    ProductA() {}
};

class FactoryA
{
public:
    static std::unique_ptr<ProductA> create()
    {
        class ProductAHelper : public ProductA {};
        return std::make_unique<ProductAHelper>();
    }
};

  在这里可以看到,这里神奇的地方就在于用一个局部类继承产品类,生成一个子类的对象,而子类的智能指针可以自动退化成父类的智能指针。

  如果需要把构造函数设为私有而不是保护,则可以将工厂制定为友元类,这里就略过不表了。

总结

  C++果然学无止境,这样的代码写出来,我有了一种:“啊哈,我也开始使用黑魔法了!”的感觉。