C++ 使用C+中的shared#ptr从公共静态成员函数访问私有构造函数+;

C++ 使用C+中的shared#ptr从公共静态成员函数访问私有构造函数+;,c++,class,shared-ptr,C++,Class,Shared Ptr,考虑下面的代码,我想将A对象的创建委托给一个名为make的方法,以便类的用户只创建包装在std::shared\u ptr中的实例: #include <memory> class A { private: A() {} public: static std::shared_ptr<A> make() { return std::make_shared<A>(); } }; int main() {

考虑下面的代码,我想将
A
对象的创建委托给一个名为
make
的方法,以便类的用户只创建包装在
std::shared\u ptr
中的实例:

#include <memory>

class A {
private:    
    A() {}

public:
    static std::shared_ptr<A> make() {
        return std::make_shared<A>();
    }
};

int main() {
    std::shared_ptr<A> a = A::make();
    return 0;
}
/usr/include/c++/8/ext/new_allocator.h:136:4: error: ‘A::A()’ is private within this context
如何解决此问题?

A类{
class A {
private:
    A() {}

public:
    static std::shared_ptr<A> make() {
        return std::shared_ptr<A>(new A());
    }
};
私人: A(){} 公众: 静态std::共享的\u ptr make(){ 返回std::shared_ptr(新的A()); } };
可以考虑使用。这与函数是静态的无关。这是因为
std::make_shared
正在尝试构造一个
A
,但它无法构造,因为构造函数是私有的。如果这样做,则会丢失内存。缺点是两个内存分配,一个用于共享的\u ptr控制块,另一个用于类A实例对象。与std::make_shared
相反,它只为控制块和对象执行一次分配。可能重要,也可能不重要,具体取决于项目和使用模式。这是的克隆