スマートポインタでのポリモーフィズムについて
Posted: 2012年10月23日(火) 10:08
スマートポインタでポリモーフィズムを実現する際にふと壁に当たりました。
クラス構造が大まかにこうなっている時(インターフェイスはリストにポインタを持たせて使用します)。
別のクラスから内部にアクセスするため、またMChara特有の機能を使う場合(MCharaのみへの影響がある処理等、CEnemyと少し違った処理をしたい場合。)、自分はMCharaに実態を持たせアクセスしようと思ったのですが。
普通のポインタなら
とできますが。
スマートポインタの場合はこれができないと思います。
代わりに、インターフェイスを利用する方法として下記がありますが、これでは、下位クラスにアクセスすることはできないと思います。
この状況でスマートポインタを使う場合、関数をインターフェイスに無駄に用意してやるか(コードの保守性の低下)、
ダウンキャストをする(煩雑になり、RTTIを使用するため実行速度の低下の可能性)以外考えつかなかったのですが、他に何か良い方法はないでしょうか。
根本的にスマートポインタを使わずに済ますか、それとも、クラスの構成そのものを変えたほうがいいでしょうか?
皆さんの意見が聞きたいです。
///インターフェイスクラス
class ICharaBase{
public:
virtual ~ICharaBase(){}
public:
virtual void Load()=0;
virtual void Ini()=0;
virtual void Calc()=0;
virtual void Draw()=0;
};
//自キャラ
class MChara:public ICharaBase{
//インターフェイスのオーバーライド
void Load();
void Ini();
void Calc();
void Draw();
//ほか項目は関係無いのでパス
};
//敵キャラ
class CEnemy:public ICharaBase{
//インターフェイスのオーバーライド
void Load();
void Ini();
void Calc();
void Draw();
//ほか項目は関係無いのでパス
};
別のクラスから内部にアクセスするため、またMChara特有の機能を使う場合(MCharaのみへの影響がある処理等、CEnemyと少し違った処理をしたい場合。)、自分はMCharaに実態を持たせアクセスしようと思ったのですが。
普通のポインタなら
std::list<ICharaBase> ICB;
MChara* mchar=new MChara();
//UPキャストだから、気にしないでOK
ICB.push_back(reintepret_cast<ICharaBase>(mchar));
スマートポインタの場合はこれができないと思います。
代わりに、インターフェイスを利用する方法として下記がありますが、これでは、下位クラスにアクセスすることはできないと思います。
std::list<std::shared_ptr<ICharaBase>> ICB;
ICB.push_back(std::shared_ptr<ICharaBase>(new MChara()));
ダウンキャストをする(煩雑になり、RTTIを使用するため実行速度の低下の可能性)以外考えつかなかったのですが、他に何か良い方法はないでしょうか。
根本的にスマートポインタを使わずに済ますか、それとも、クラスの構成そのものを変えたほうがいいでしょうか?
皆さんの意見が聞きたいです。