静态使用make_unique和make_shared不起作用

时间:2017-06-02 03:44:28

标签: c++ c++11

我正在尝试学习可以在C ++中使用的工厂模式。我不知道为什么我不能归还一个独特的ptr。我可以返回一个共享的ptr就好了。这是我的代码:

class FactoryMethodExample {
    FactoryMethodExample() {}
public:
    static FactoryMethodExample get_instance() {
            return {};
    }

    static FactoryMethodExample * get_pointer() {
        return new FactoryMethodExample;
    }

    static unique_ptr<FactoryMethodExample> get_unique_instance() {
        return make_unique<FactoryMethodExample>();
    }

    static shared_ptr<FactoryMethodExample> get_shared_instance() {
        return shared_ptr<FactoryMethodExample>();
    }

    void verify() {
        cout << "I exist" << endl;
    }
};

此代码无法编译。我收到这个错误:

error: calling a private constructor of class 'FactoryMethodExample'
return unique_ptr<_Tp>(new _Tp(_VSTD::forward<_Args>(__args)...));

1 个答案:

答案 0 :(得分:1)

首先,您的shared_ptrunique_ptr示例无法比较。

make_unique 创建一个用值初始化的unique_ptr

shared_ptr 只是shared_ptr类的构造函数调用,它将使用空指针初始化。

这就是为什么你得到两个不同的结果。

您遇到错误的原因是因为您有私有构造函数。最简单的解决方案是让make_unique(和make_shared)成为朋友。

请参阅以下问题以获得一些指导:How to make std::make_unique a friend of my class

此外,您的功能名称可能会产生误导。 get_shared_instance 意味着每次都会返回相同的实例,我想你想返回一个新实例的shared_ptr?