Effective C++ Item 352009年08月20日 11時11分47秒

  • 仮想関数の代用としては NVI 慣用句を始めとした各種のデザインパターンが有効だ。
  • メンバ関数を非メンバ関数にすることの欠点は、メンバ変数へのアクセスをなくす事だ。
  • tr1::function は汎用関数ポインタとして用いる事が出来る。

NVI は non-virtual interface idiom の略。NVI の例。


class GameCharacter
{
    public:
        int healthValue() const
        {
            ...
            int retVal = doHealthValue();
            ...
            return retVal;
        }
    private:
        virtualint doHealthValue() const{...}
};

直接、又は tr1::function を用いた関数ポインタの例。


class GameCharacter;
int defaultHealthCalc(const GameCHaracter& gc);

class GameCharacter
{
    public:
        typedef std::tr1::function HealthCalcFunc;

        explicit GameCharacter(HealthCalcFunc hcf = defaultHealthCalc):
            healthFunc(hcf){}
    private:
        HealthCalcFunc healthFunc;
};

tr1::function を用いた技法は型の自動変換が行なわれるので、強制的に型を縛り付ける関数ポインタよりも柔軟に使うことが出来る。

二つのクラスに分けて各々で継承を行なう典型的なデザインパターンの方法もある。

前回次回

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2009/08/20/4525360/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。