Código:
#include <iostream>
#include <set>
using namespace std;
class objeto{
private:
int id;
public:
objeto(int id){
this->id = id;
}
objeto(){
id = 0;
}
void setId(int id){
this->id = id;
}
int getId(){
return id;
}
};
using namespace std;
bool comp(objeto* a, objeto* b){
return a->getId() < b->getId();
}
int main(){
bool(*fn_pt)(objeto*,objeto*) = comp;
set<objeto*, bool(*)(objeto*,objeto*)> conj (fn_pt);
objeto * apuntador;
set<objeto*>::iterator it;
objeto a(35);
objeto b(17);
objeto c(34);
objeto d(18);
objeto e(44);
objeto f(1);
objeto g(42);
conj.insert(&a);
conj.insert(&b);
conj.insert(&c);
conj.insert(&d);
conj.insert(&e);
conj.insert(&f);
conj.insert(&g);
for(it = conj.begin(); it != conj.end(); it++){
apuntador = *it;
cout << apuntador->getId() << endl;
}
return 0;
}
Bien, comp es la función de comparación, y fn_pt el puntero a dicha función, que es la que le paso al set. Todo genial, ¿verdad? Compila perfecto, y devuelve en la salida los elementos ordenados por su Id, todo genial, de maravilla. Ahora hagamos el siguiente código:
Código:
#include <iostream>
#include <set>
using namespace std;
class Objeto{
private:
int id;
public:
Objeto(int id){
this->id = id;
}
Objeto(){
id = 0;
}
void setId(int id){
this->id = id;
}
int getId(){
return id;
}
};
bool comp(Objeto* a, Objeto* b){
return a->getId() < b->getId();
}
bool(*fn_pt)(Objeto*,Objeto*) = comp;
class Contenedor{
private:
set<Objeto*, bool(*)(Objeto*,Objeto*)> conj (fn_pt);
public:
void addObjeto(Objeto* o){
conj.insert(o);
}
void mostrarObjetos(){
Objeto* aux;
set<Objeto*>::iterator it;
for(it = conj.begin(); it != conj.end(); it++){
aux = *it;
cout << aux->getId();
}
}
};
int main(){
cout << "Hola =)" << endl;
return 0;
}
Pues señoras y señores, este código no funciona, y se me está averiando el cerebro de intentar averiguar por qué. Una vez que meto el set en los datos de la clase, me tira siempre el mismo error, que el puntero fn_pt a la función comp no es un tipo, y por tanto no puede compilar, ¡¿pero por qué pasa esto si en el código anterior funcionaba perfecto?! He probado a meterlo en la parte pública y tampoco, no entiendo ya por qué pasa esto.
Si alguien me consigue explicar por qué al definirlo dentro de una clase el set deja de funcionar con el puntero a la función de comparación, le estaré profundamente agradecido.
Muchas gracias y buenos días .