#前提
コンストラクタがprotectedで定義されたクラスがあること
class TestClass
{
protected:
TestClass()
{
}
};
上記で定義したクラスはコンストラクタにアクセスできないため、newできない。
void main()
{
// 生成不可
TestClass *test = new TestClass();
}
無理やりできる方法は果たしてあるのか。
#方法
①コンストラクタがpublicなクラスに派生させる。
②newさせるための関数を自作する。
##①コンストラクタがpublicなクラスに派生させる
// 流用しやすいようにテンプレートクラスとして定義
template <class ProtectedConstructorClass>
class PublicConstructorClass : ProtectedConstructorClass
{
public:
PublicConstructorClass()
{
}
};
##②newさせるための関数を自作する
// 流用しやすいようにテンプレート関数として定義
template <class ProtectedConstructorClass>
ProtectedConstructorClass* create()
{
return (ProtectedConstructorClass*) new PublicConstructorClass<ProtectedConstructorClass>;
}
##①②をするとnewと同等のことができる。
void main()
{
// 生成可能
TestClass* test2 = create<TestClass>();
delete test2;
}
#まとめ
newをすることを目的に書いていますので、こちらの内容に意味はあまりありません。
抜け道のようなものです。
テンプレートの使い方の勉強になれば大変うれしいです。
コンストラクタがprivateのクラスではできません。