-2

1つのクラスに対して複数の順序関係を実装するための最良の方法はどれですか?ストラテジーパターンのアイデアはありますが、それが良いアイデアかどうかはわかりません。そして、最善の方法がないのなら、なぜですか?

4

2 に答える 2

1

ファンクター クラスを作成し、使用する順序関係でメンバーを初期化します。メンバーoperator()を使用して、2 つのオペランドの順序を決定します。

class Ordering
{
public:
    Ordering(int method) : _method(method) {}
    bool operator()(const MyObject & first, const MoObject & second) const
    {
        switch(_method)
        {
            case 0:
                return first.name < second.name;
            case 1:
                return first.age < second.age;
            // ...
        }
    }
    int _method;  // an enum would be better
};

std::sort(myobjs.begin(), myobjs.end(), Ordering(selected_method));
于 2012-12-26T22:52:45.163 に答える
0

ここでは戦略がより良い方法だと思います。スイッチの構造が良いアイデアかどうかはよくわかりません(1つのスイッチで1000の比較方法を想像してみてください...重すぎますね)。

それでは、メソッドの比較が必要なクラスであるAを考えてみましょう。

メソッドごとに1つのクラスを作成することをお勧めします。このクラスは、Aのコンポーネントになります。

例えば ​​:

class A{
    private:
    //Some attributes
    Comparator<A> comp_;

    public:
    //Some methods (including constructor)
    bool operator()(const MyObject & first, const MoObject & second) const
    {
        return comp_.compare(first,second);
    }
     void setComparator(Comparator<A>& comp){
        comp_ = comp;
    }
}


//Forgot the syntax about template. So there is a template with one parameter
class Comparator{
     public:
     //Constructor

     //To overwrite on subclasses
     virtual bool compare(T& first, T& second) = 0;


}

この構成を使用すると、Aを変更せずに、プログラムの実行時に適切なコンパレータを設定するだけで、メソッドを簡単に追加できます。

于 2012-12-26T23:19:32.800 に答える