什么時候我們會再一個擁有保護或者私有構造函數的類中使用智能指針呢?這種其中就是我們想:
- 不愿意類的使用者自己構造類的對象,只能從類的內部產生對象。
- 想利用智能指針的便利性。
而這樣的場景是經常遇到的。在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");//錯誤