using shared_ptr in a class with private or protected constructor

什么時候我們會再一個擁有保護或者私有構造函數的類中使用智能指針呢?這種其中就是我們想:

  • 不愿意類的使用者自己構造類的對象,只能從類的內部產生對象。
  • 想利用智能指針的便利性。

而這樣的場景是經常遇到的。在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");//錯誤

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,540評論 1 51
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,767評論 18 399
  • 1.面向對象的程序設計思想是什么? 答:把數據結構和對數據結構進行操作的方法封裝形成一個個的對象。 2.什么是類?...
    少帥yangjie閱讀 5,051評論 0 14
  • 1. C++基礎知識點 1.1 有符號類型和無符號類型 當我們賦給無符號類型一個超出它表示范圍的值時,結果是初始值...
    Mr希靈閱讀 18,040評論 3 82
  • 提一盞油燈 尋一片天空 這里有你的書桌 那端有你的茶壺 虛無席上隱著海棠花 幽清靜雅,淡淡迷香 掂起一支綠 化開千...
    楓洛閱讀 172評論 8 5