1

私のコードの一般的なシナリオは、階層内の多くのクラスで使用されるファンクターを取得したことです。

すべてのクラスがアクセスできるようにし、DRYを維持するために、私は通常、次のように基本クラスの保護された内部構造体として定義します。

class Base
{
protected:
    struct CommonFunctor
    {
        bool operator()()
        {
            return true;
        }
    };
};

class DerivedA : public Base
{
    void FooA()
    {
        bool test = CommonFunctor()();
    }
};

class DerivedB : public Base
{
    void FooB()
    {
        bool test = CommonFunctor()();
    }
};

このソリューションは、基本クラスに多くの小さなファンクターが散らかっていて、内部のみであり、一般に公開されていなくても、基本クラスの可読性が低下するため、このソリューションは好きではありません。

このシナリオの他の解決策を知っていますか?

4

3 に答える 3

1

ファンクターを新しいファイル(BaseClassFunctors.cpp+ BaseClassFunctors.h)に実装するだけです。オプションのサブ名前空間(名前空間main.internalなど)を使用して、名前空間内に配置します。

これで、基本クラスのヘッダーを乱雑にすることなく、必要な派生クラスにヘッダーファイルをインクルードできます。

于 2012-05-23T05:59:24.730 に答える
0

私(そして、明らかに、他のすべての人)が多重継承を嫌うのと同じくらい、それはここで役に立ちます。

すべてのファンクターを含む2番目のクラスを作成し、から派生した子クラスに、両方とこの新しいクラスをBase継承します。Base

于 2012-05-22T07:47:36.657 に答える
0

ファンクターを他の場所に実装しても、ベースのメンバーとして保持できます。

class Base
{
protected:
    struct CommonFunctor;
};   

struct Base::CommonFunctor
{
    bool operator()()
    {
        return true;
    }
};
于 2012-05-22T08:43:31.103 に答える