什么时候我们会再一个拥有保护或者私有构造函数的类中使用智能指针呢?这种其中就是我们想:
- 不愿意类的使用者自己构造类的对象,只能从类的内部产生对象。
- 想利用智能指针的便利性。
而这样的场景是经常遇到的。在stack overflow上有人分享了一种方法。具体的实现思路是在类内声明一个无意义的保护类型,并将这个保护类型作为公有类型构造函数的一个参数。那么类内使用智能指针时,对这个无意义的保护类型具有访问权限,且构造函数为公有,所以对于智能指针不存在任何访问限制,而在类外想构造类对象,虽然对构造函数具有访问权限,但因为无意义的保护类型受限,所以是无法构造对象的。示例代码:
class A
{
protected:
struct ConstructorAcess
{
explicit ConstructorAcess(int){}
};
public:
A(const ConstructorAcess&,string){}
static shared_ptr<A> create(string str)
{
return make_shared<A>(ConstructorAcess{ 0 }, str);
}
private:
string _str;
};
shared_ptr<A> pa = A::create("hello");//正确
A a(A::ConstructorAcess{ 0 }, "hello");//错误