elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con la función de comparación en el set de STL (C++)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con la función de comparación en el set de STL (C++)  (Leído 1,403 veces)
placa4

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Problema con la función de comparación en el set de STL (C++)
« 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 :).


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con la funcion Chr
Programación Visual Basic
sircid 2 1,649 Último mensaje 9 Agosto 2006, 14:50 pm
por sircid
Problema con funcion
Programación C/C++
Caster 3 2,597 Último mensaje 30 Septiembre 2012, 08:59 am
por Caster
Problema con if de comparación de Strings
Java
Runforyourlife 2 1,591 Último mensaje 26 Noviembre 2016, 23:30 pm
por Runforyourlife
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines