c – 对指针列表进行排序
我再一次发现自己在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<BaSEObject*> 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 我最初认为我可能会在比较器中做一些演员.但是,这会消除常数.然后我想可能我可以比较类型,但后来一切看起来都很乱,甚至都不正确. 我怎么能实现这种排序,仍然使用list< BaSEObject *> :: sort? 谢谢 解决方法
您正在考虑进行双重调度 – 即根据两个对象的类型而不是一个来调用虚函数.看看这篇维基百科文章,了解单挑
http://en.wikipedia.org/wiki/Double_dispatch.我不得不说每当我发现自己处于这种情况时,我会尝试改变方向:-)
我可以对您的代码做一些观察.它并没有完全错误,但是: >在C中,std :: list是最后的容器 – 你通常应默认使用std:;向量,除非你特别需要一个只有list提供的功能:>受保护的数据总是一个坏主意 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |