using shared_ptr in a class with private or protected constructor

970 ワード

保護またはプライベート構造関数を持つクラスでスマートポインタを使用するのはいつですか?その中で私たちはこう考えています.
  • クラスのユーザ自身がクラスのオブジェクトを構築したくない場合は,クラスの内部からのみオブジェクトを生成する.
  • スマートポインタの利便性を利用したい.

  • このようなシーンはよくあります.stack overflowで一つの方法を共有した人がいます.具体的な実装構想は,クラス内で無意味な保護タイプを宣言し,この保護タイプを公有タイプ構造関数のパラメータとすることである.クラス内でスマートポインタを使用する場合、この無意味な保護タイプにアクセス権があり、コンストラクション関数が公有であるため、スマートポインタにはアクセス制限は存在しないが、クラス外でクラスオブジェクトを構築しようとすると、コンストラクション関数にアクセス権があるが、無意味な保護タイプが制限されているため、オブジェクトを構築することはできない.サンプルコード:
    class A
    {
    protected:
        struct ConstructorAcess
        {
            explicit ConstructorAcess(int){}
        };
    public:
        A(const ConstructorAcess&,string){}
        static shared_ptrcreate(string str)
    {
    return make_shared(ConstructorAcess{ 0 }, str);
    }
    private:
    string _str;
    };
    shared_ptrpa = A::create("hello");// しい
    A a(A::ConstructorAcess{ 0 }, "hello");//エラー