仮想デストラクタ(2)
修正案その1
昨日のコメントの通り。
class ClassID{ public: enum EType{ Hoge , Hogehoge , }; }; class Base{ public: virtual ~Base(){} virtual ClassID::EType GetID() = 0; }; class Hoge{ public: virtual ClassID::EType GetID(){ return ClassID::Hoge; } }; class Hogehoge{ public: virtual ClassID::EType GetID(){ return ClassID::Hogehoge; } };
修正案その2
Factory を通じてオブジェクトを生成するようにする。
class ClassID{ public: enum EType{ Hoge , Hogehoge , }; }; class Factory; class Base{ public: virtual ClassID::EType GetID(){ return _id; } protected: Base(){} virtual ~Base(){} private: void SetID( ClassID::EType id ){ _id = id; } ClassID::EType _id; friend class Factory; }; class Hoge{ friend class Factory; }; class Hogehoge{ friend class Factory; }; class Factory{ static Base* Create( ClassID::EType id ){ Base* p = null; switch( id ){ case ClassID::Hoge: p = new Hoge(); break; case ClassID::Hogehoge: p = new Hogehoge(); break; } if( p != null ){ p->SetID( id ); } return p; } static void Release( Base* p ){ delete p; } };
ただ、この方法だと Factory を friend にするのがめんどうなのと、引数付きのコンストラクタ呼び出しがめんどうになります(´・ω・`)
自分が考えつくのはこれぐらいなんですが、他に良い方法があればコメントにお願いしますm(__)m