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
相反,它只为控制块和对象执行一次分配。可能重要,也可能不重要,具体取决于项目和使用模式。这是的克隆