Еще раз я не справляюсь с какой-то очень простой задачей в C ++. Иногда мне хотелось бы выучить все, что я знаю, из ОО в java, поскольку мои проблемы обычно начинаются с мысли, как 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
- Чтобы сравнить
BaseObject
объектов, используйте его id
s, как и раньше.
- Для сравнения
Child
объектов, сравните его var
s. Если они равны, отступите к правилу 2.
GrandChild
объекты должны вернуться к поведению Child
(правило 3).
Сначала я подумал, что, возможно, смогу сделать несколько приведений в Comparator
. Однако это отбрасывает постоянство. Тогда я подумал, что, вероятно, я мог бы сравнить typeid
с, но тогда все выглядело грязно и это даже не правильно.
Как я мог реализовать этот вид, все еще используя list<BaseObject*>::sort
?
Спасибо