Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: placa4 en 26 Noviembre 2012, 11:42 am



Título: Problema con la función de comparación en el set de STL (C++)
Publicado por: placa4 en 26 Noviembre 2012, 11:42 am
Hola, ando trasteando con el contenedor set de la STL de C++, y me he topado con algo que me está haciendo perder los nervios. Quiero definir el puntero a una función para decirle al set de qué manera debe ordenar los elementos que yo le introduzco. Hasta ahí bien, ¿no? Pues tengo este código, que he hecho a modo de ejemplo para explicarme mejor, no tiene utilidad práctica:

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 :).