Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema al devolver objeto

Estas en el tema de Problema al devolver objeto en el foro de C/C++ en Foros del Web. Buenas tardes chic@s, Estoy implementando un motor de inferencia y tengo un pequeño problema que me lleva mosqueado un par de días, así que acudo ...
  #1 (permalink)  
Antiguo 28/11/2014, 13:31
 
Fecha de Ingreso: noviembre-2014
Ubicación: Murcia
Mensajes: 3
Antigüedad: 9 años, 4 meses
Puntos: 0
Problema al devolver objeto

Buenas tardes chic@s,

Estoy implementando un motor de inferencia y tengo un pequeño problema que me lleva mosqueado un par de días, así que acudo a vosotros para ver si alguien más experimentado que yo en c++ me puede dar indicaciones de donde estoy fallando.

El problema empieza en este método:

Código:


Código C++:
Ver original
  1. bool MotorDeInferencia::aplicar(Regla* r, Asociacion* as){
  2.     cout << "MotorDeInferencia::aplicar()"<<endl;
  3.  
  4.  
  5.     bool aplicada =bh->aplicar(r, as);  //<---------
  6.  
  7.  
  8.     cout << "as.t" << as->t << endl;
  9.     cout <<"Retornando al primer consecuente de la regla: " << r->getId()<<endl;;
  10.     cout << "Valor: " << as->valor << endl;
  11.     return aplicada;
  12.  
  13. }

El caso es que el objeto bh contenido en la clase MotorDeInferencia llama a su método aplicar. (el parámetro r es una regla con la que construiremos el objeto as).
Hasta ahí todo bien.

El siguiente método es el llamado anteriormente por bh y es aquí donde se construye el objeto.


bool BaseDeHechos::aplicar(Regla* r, Asociacion* as){
Código C++:
Ver original
  1. cout << "BaseDeHechos::aplicar()"<<endl;
  2.     vector<Asociacion> consecuentes=r->getConsecuente();
  3.     if(consecuentes.size()==2 &&(isContenido(consecuentes[0])
  4.                              || isContenido(consecuentes[1])))
  5.         return false;
  6.     if(consecuentes.size()==2 && isNegacion(consecuentes[0])){
  7.         *as=consecuentes[1];
  8.         return true;
  9.     }        
  10.     as=&consecuentes[0];
  11.  
  12. /* cout << "consecuentes.size:"<<consecuentes.size()<<endl;
  13.     cout << "as->t" << as->t << endl;
  14.     cout << "as->valor: " << as->valor << endl;*/
  15.  
  16.     return true;    
  17.    
  18. }

Este método muestra los valores correctos por pantalla, pero una vez que salimos de este método al de MotorDeInferencia, los accesos al objeto "as" dan valores sin sentido.

En conclusión, tanto los mensajes mostrados en el primer método, como los comentados en el segundo método, deberían dar el mismo valor. Pero no lo dan.

No logro entender porque pierdo el objeto al devolverlo. Agradezco muchísimo la ayuda que me pudiesen dar, he probado a cambiar de todo, tanto como cambiar los acceso a los objetos mediante punteros o sin ellos, a devolver en el return contenido[0] (Que es el que me interesa en esa regla), y muchas más cosas.

Saludos.
  #2 (permalink)  
Antiguo 28/11/2014, 13:33
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Problema al devolver objeto

Deberías revisar la implementación del operador de asignación (=) de tu clase "Asociacion". Este operador se llama al hacer la asignación "*as=consecuentes[1]".

Por otro lado, as=&consecuentes[0]; esto no va a tener ningún efecto porque "as" está declarada a nivel local, luego si haces que "as" apunte a otro objeto, ese cambio se va a perder fuera de la función:

Código C++:
Ver original
  1. void func( int* ptr )
  2. {
  3.  *ptr = 200;
  4.   ptr = 100;
  5. }
  6.  
  7. int main( )
  8. {
  9.   int dato;
  10.   int* ptr = &dato;
  11.  
  12.   func( ptr );
  13.  
  14.   printf( "%d\n", *ptr ); // imprime 200, ok
  15.   printf( "%p\n, ptr ); // Va a ser distinto de 100, este cambio no se ha aplicado
  16. }
  #3 (permalink)  
Antiguo 28/11/2014, 13:48
 
Fecha de Ingreso: noviembre-2014
Ubicación: Murcia
Mensajes: 3
Antigüedad: 9 años, 4 meses
Puntos: 0
Respuesta: Problema al devolver objeto

Entonces, por lo que me dices, declarando un atributo Asociacion en la clase BaseDeHechos para usarlo en este fín me resolvería el problema?

Algún consejillo.


P.D. Gracias por contestarme en los dos temas que he puesto, tanto aquí como en el otro foro. ;-D
  #4 (permalink)  
Antiguo 28/11/2014, 14:05
 
Fecha de Ingreso: noviembre-2014
Ubicación: Murcia
Mensajes: 3
Antigüedad: 9 años, 4 meses
Puntos: 0
Respuesta: Problema al devolver objeto

Muchísimas gracias eferion, ese era el problema, declarando consecuentes[] como atributo de BaseDeHechos he matado los dos pájaros de un tiro, ahora le he cambiado la función de retorno a Asociacion* y devuelvo un puntero a consecuentes[x] y todo perfecto.

Gracias de nuevo.

Etiquetas: clase, devolver, int, objeto
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:11.