Una vez más me encuentro fallando en una tarea realmente simple en C++. A veces me gustaría poder aprender todo lo que sé de OO en Java, ya que mis problemas generalmente comienzan por pensar como Java. De todos modos, tengo un std::list<BaseObject*>
que quiero ordenar. Digamos que BaseObject
es:Ordene una lista de punteros
class BaseObject {
protected:
int id;
public:
BaseObject(int i) : id(i) {};
virtual ~BaseObject() {};
};
puedo ordenar la lista de puntero a BaseObject
con una estructura comparador:
struct Comparator {
bool operator()(const BaseObject* o1, const BaseObject* o2) const {
return o1->id < o2->id;
}
};
Y se vería así:
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
Hasta aquí , todo está bien. Sin embargo, introduje algunas clases derivadas:
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() {};
};
Así que ahora me gustaría ordenar siguiendo las siguientes reglas:
- Para cualquier
Child
objetoc
yBaseObject
b
,b<c
- Para comparar
BaseObject
objetos , use suid
s, como antes. Para compararChild
objetos, compararvar
s. Si son iguales, retroceda a la regla 2. GrandChild
los objetos deben recurrir al comportamientoChild
(regla 3).
Inicialmente pensé que probablemente podría hacer algunos moldes en Comparator
. Sin embargo, esto desecha la constness. Entonces pensé que probablemente podría comparar typeid
s, pero luego todo parecía desordenado y ni siquiera es correcto.
¿Cómo podría implementar este tipo, aún usando list<BaseObject*>::sort
?
Gracias
'dynamic_cast'? – kennytm
¿Estoy entendiendo esto correctamente? Primero, B
Dan