枠-1
CFastDraw draw; CFastPlane plane(&draw);
枠-2
CFastDraw draw; smart_ptr<ISurface> surface(new CFastPlane(&draw));
枠-3
class CPlane { /** smart_ptr<ISurface> といちいち書くのは面倒極まりないので.. */ public: CPlane(); /// ポインタのふりをするための仕掛け ISurface& operator*() const {return *get(); } ISurface* operator->() const {return get(); } /// ISurfaceへの暗黙の変換 operator ISurface* () const { return get(); } ISurface* get() const { return p_.get(); } static void SetFactory(smart_ptr<IPlaneFactory>&pFactory) { pFactory_ = pFactory; } static smart_ptr<IPlaneFactory> GetFactory() { return pFactory_; } protected: smart_ptr<ISurface> p_; // p_; ←って泣いてるの? static ThreadLocal<smart_ptr<IPlaneFactory> > pFactory_; };
list-1 factory
class IPlaneFactory { public: virtual ISurface* CreateInstance() = 0; };
list-2
struct CPlaneFactoryFastPlane : public IPlaneFactory { /** IPlaneFactory派生クラス。こいつはCFastPlaneを生成するためのfactory */ CPlaneFactoryFastPlane(CFastDraw*p) : pDraw_(p) {} virtual ISurface* CreateInstance(){ return new CFastPlane(pDraw_);} protected: CFastDraw* pDraw_; };
list-3
class CFastPlaneFactory { /** このクラスは、コンストラクタのなかで、 IPlaneFactory派生クラスをCPlaneに対して設定する これにより、このクラスをCAppに持たせさえすれば、 そのスレッドは、CPlaneは、すべてCFastPlaneを意味することになる */ public: CFastDraw* GetDraw() { return m_vFastDraw.get(); } CFastPlaneFactory(); protected: smart_ptr<CFastDraw> m_vFastDraw; // FastDraw持ってますねん };
list-4 CApp.h
class CApp : public CAppFrame { public: virtual void MainThread(); // これがメインスレッド CFastDraw* GetDraw() { return drawFactory_.GetDraw(); } protected: CFastPlaneFactory drawFactory_; };
list-5
CPlane plane; plane->Load("moemoe.jpg"); // 回転描画 GetDraw()->GetSecondary()->RotateBltFast(plane,0,0,nAngle);
枠-4 こういう順番で書いてはいけない
CPlane plane_; CFastPlaneFactory planeFactory_;