読者です 読者をやめる 読者になる 読者になる

Life, Education, Death

プログラミング以外でも思ったことをつらつらと書きたい

C++の書き方とかまだしっかり身についてないなぁと思った。

http://wikiwiki.jp/redstrange/?C%2B%2B%A5%B3%A1%BC%A5%C7%A5%A3%A5%F3%A5%B0%A5%B9%A5%BF%A5%A4%A5%EB


ライブラリの設計を考えるときに、一つのプラットフォームに限らず他でも動いて欲しいなと思って試行錯誤中なのだが、

システム依存の部分を減らしたいけど、減らすのに時間をかけられない状況である今。

楽していいものをどーつくろうかと。


Coreクラスがあって、それの子供にAシステム実装のCoreAとBシステム実装のCoreBがある。

    class Core
    {
    public:
         Core(){}
         virtual ~Core(){}
         virtual void TestFunc() = 0;
    };

    class CoreA : public Core
    {
    public:
        CoreA(){}
        ~CoreA(){}
        void Init( ParamA p );        // 生成後にFactoryで実行して初期化するメソッド
        void TestFunc(){}
        void CoreAFunc(){}
    };

    class CoreB : public Core
    {
    public:
        CoreB(){}
        ~CoreB(){}
        void Init( ParamB p );        // 生成後にFactoryで実行して初期化するメソッド
        void TestFunc(){}
        void CoreBFunc(){}
    };

どちらのクラスでもシステム依存のパラメータがいくつか必要になる。
Coreだけならば、ただ単にFactoryでもすればいいんだけれども、UtilsAとかUtilsBとかいうクラスもあるので

システム依存のパラメータが裏で(子供クラス同士で)やり取りされることがある。


たとえば、CoreAに渡したハンドルをUtilsAでも使うとか


このときにはUtilsにはCoreしか渡したくないので、どうしよう?と悩んでいた。

Coreしか渡していないが、UtilsAではCoreAクラスが欲しい。
RTTIを利用して安全にキャストするのもいいが、コストがちょっとなぁーとか思っていたので結局こうなった。


inc.h

    #define USE_CORE_A

    #ifdef USE_CORE_A
        typedef CoreA CoreClass
    #endif


Utils.h

    class Utils
    {
    pubic:
        Utils( Core& core ){}
    };

    class UtilsA : public Utils
    {
        UtilsA( Core& core ) : Utils( core )
        {
            static_cast<CoreClass&>( core ).CoreAFunc();
        }
    };

inc.hを共通のインクルードファイルとしてすべてで読み込む。
ライブラリを使う人はこのファイルにUSE_CORE_Aを定義するか、コンパイラに定数を設定する(VCなら定義ができた)
ことでどのCoreクラスを使っているかをスイッチングする方式にした。

本当はCoreクラスに渡すパラメータも依存性をどんどん取り除くほうがいいんだろうなぁと思いつつ。


未熟です。