我再一次发现自己在C中完成了一些非常简单的任务.有时候我希望我可以在
java中从OO中学习我所知道的所有内容,因为我的问题通常都是从
Java开始思考.
无论如何,我有一个std :: list< BaSEObject *>我想排序.假设BaSEObject是:
class BaSEObject {
protected:
int id;
public:
BaSEObject(int i) : id(i) {};
virtual ~BaSEObject() {};
};
我可以使用比较器结构对指向BaSEObject的指针列表进行排序:
struct Comparator {
bool operator()(const BaSEObject* o1,const BaSEObject* o2) const {
return o1->id < o2->id;
}
};
它看起来像这样:
std::list mylist;
mylist.push_back(new BaSEObject(1));
mylist.push_back(new BaSEObject(2));
// ...
mylist.sort(Comparator());
// intentionally omitted deletes and exception handling
直到这里,一切都很好.但是,我介绍了一些派生类:
class Child : public BaSEObject {
protected:
int var;
public:
Child(int id1,int n) : BaSEObject(id1),var(n) {};
virtual ~Child() {};
};
class GrandChild : public Child {
public:
GrandChild(int id1,int n) : Child(id1,n) {};
virtual ~GrandChild() {};
};
所以现在我想按照以下规则排序:
>对于任何Child对象c和BaSEObject b,b< c
>要比较BaSEObject对象,请像以前一样使用其ID.
>要比较Child对象,请比较其变量.如果它们相等,则回退到规则2.
> GrandChild对象应该回退到Child行为(规则3).
我最初认为我可能会在比较器中做一些演员.但是,这会消除常数.然后我想可能我可以比较类型,但后来一切看起来都很乱,甚至都不正确.
我怎么能实现这种排序,仍然使用list< BaSEObject *> :: sort?
谢谢