using shared_ptr in a class with private or protected constructor
970 ワード
保護またはプライベート構造関数を持つクラスでスマートポインタを使用するのはいつですか?その中で私たちはこう考えています.クラスのユーザ自身がクラスのオブジェクトを構築したくない場合は,クラスの内部からのみオブジェクトを生成する. スマートポインタの利便性を利用したい.
このようなシーンはよくあります.stack overflowで一つの方法を共有した人がいます.具体的な実装構想は,クラス内で無意味な保護タイプを宣言し,この保護タイプを公有タイプ構造関数のパラメータとすることである.クラス内でスマートポインタを使用する場合、この無意味な保護タイプにアクセス権があり、コンストラクション関数が公有であるため、スマートポインタにはアクセス制限は存在しないが、クラス外でクラスオブジェクトを構築しようとすると、コンストラクション関数にアクセス権があるが、無意味な保護タイプが制限されているため、オブジェクトを構築することはできない.サンプルコード:
このようなシーンはよくあります.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");//エラー