为一个类实现几个顺序关系?

时间:2012-12-26 22:41:34

标签: c++

哪种方法只为一个类实现多个订单关系?我对Strategy Pattern有一个想法,但我不确定这是个好主意。如果没有最好的方法,为什么?

2 个答案:

答案 0 :(得分:1)

创建一个仿函数类并使用您要使用的订单关系初始化一个成员。让operator()使用该成员来决定两个操作数的排序。

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));

答案 1 :(得分:0)

我认为策略是一种更好的方式,我不太确定开关结构是个好主意(想象一下,1000个比较方法在一个开关中......太重了,不是吗?)

所以让A,一个需要方法比较的类。

我建议为每个方法创建一个类,该实例将是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,只需在程序执行的任何时刻设置正确的比较器。