【发布时间】:2011-02-03 00:11:13
【问题描述】:
我再次发现自己在 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和BaseObjectb,b<c - 要比较
BaseObject对象,请像以前一样使用其ids。 - 要比较
Child对象,请比较其vars。如果它们相等,则回退到规则 2。 -
GrandChild对象应回退到Child行为(规则 3)。
我最初认为我可以在Comparator 中做一些演员表。然而,这抛弃了 constness。然后我想可能我可以比较typeids,但后来一切看起来都很乱,甚至都不正确。
我怎样才能实现这种排序,仍然使用list<BaseObject*>::sort ?
谢谢
【问题讨论】:
-
我理解正确吗?首先,B