什么時(shí)候我們會(huì)再一個(gè)擁有保護(hù)或者私有構(gòu)造函數(shù)的類中使用智能指針呢?這種其中就是我們想:
- 不愿意類的使用者自己構(gòu)造類的對(duì)象,只能從類的內(nèi)部產(chǎn)生對(duì)象。
- 想利用智能指針的便利性。
而這樣的場(chǎng)景是經(jīng)常遇到的。在stack overflow上有人分享了一種方法。具體的實(shí)現(xiàn)思路是在類內(nèi)聲明一個(gè)無意義的保護(hù)類型,并將這個(gè)保護(hù)類型作為公有類型構(gòu)造函數(shù)的一個(gè)參數(shù)。那么類內(nèi)使用智能指針時(shí),對(duì)這個(gè)無意義的保護(hù)類型具有訪問權(quán)限,且構(gòu)造函數(shù)為公有,所以對(duì)于智能指針不存在任何訪問限制,而在類外想構(gòu)造類對(duì)象,雖然對(duì)構(gòu)造函數(shù)具有訪問權(quán)限,但因?yàn)闊o意義的保護(hù)類型受限,所以是無法構(gòu)造對(duì)象的。示例代碼:
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");//錯(cuò)誤