Ver Mensaje Individual
  #6 (permalink)  
Antiguo 12/02/2014, 08:56
dehm
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Respuesta: Punteros a plantillas de funciones...¿posible?

Hola de nuevo:

Complemento un poco la respuesta por si a alguien le puede venir bien saber cómo ha quedado resuelto mi problema.

Parto de que tengo una clase grafo, que entre otros métodos tiene uno que muestra los hijos de un nodo dado:

Código C++:
Ver original
  1. class TratarArista;//declaración previa Importante!!
  2.  
  3.  
  4. template <typename datonodo_t, typename datoarista_t>
  5. void Grafo<datonodo_t,datoarista_t>::recorrerHijos(const pNodo& padre, TratarArista& tratamiento)
  6. {
  7.     if (padre->adyacente!=0)
  8.         {
  9.             pArista A=padre->adyacente;
  10.             while (A->siguiente!=0)
  11.                 {
  12.                     tratamiento(A);
  13.                     A=A->siguiente;
  14.                 }
  15.             tratamiento(A);
  16.         }
  17. }

Esta función me puede venir bien para mostrar los nodos de un hijo, o buscar algún valor entre ellos, etc.

Entonces, por sugerencia de CalgaryCorpus, he usado functores.

Los he definido así (algo ha cambiado desde el post anterior):

Pongo el ejemplo de Imprimir

(Todos los functores los he metido en un fichero Functores.h)


Código C++:
Ver original
  1. struct TratarArista
  2. {
  3.     //miembros:
  4.     string Nombre;
  5.     arista<Medicion,Concepto>*& AA;
  6.  
  7.     //constructor:
  8.     TratarArista(string nombre, arista<Medicion,Concepto>*& aux);
  9.  
  10.     //función miembro:
  11.     virtual void operator()(arista<Medicion,Concepto>* a)=0;
  12. };
  13.  
  14. struct Imprimir:public TratarArista
  15. {
  16.     Imprimir (string nombre, arista<Medicion,Concepto>*& aux);
  17.  
  18.     virtual void operator()(arista<Medicion,Concepto>* a)
  19.     {
  20.         cout<<"│"<<a->destino->datonodo.LeeCodigo()<<"│"<<a->destino->datonodo.LeeUd()<<a->destino->datonodo.LeeResumen()<<"│"<<endl;        
  21.     }
  22. };

Ahora sólo me queda llamarlos dentro de la clase que contiene al grafo.
Por ejemplo:
Código C++:
Ver original
  1. void Contenedor::MostrarHijos()
  2. {
  3.     string nombreNodo="";
  4.     TratarArista* tratamiento=new Imprimir (nombreNodo, auxiliar);    
  5.     G.recorrerHijos(padre, *tratamiento);
  6. }

(En este caso no me interesa el valor del string, por eso entro con una cadena vacía. Hay otros casos en los que quiero buscar el Codigo de un nodo, y entonces sí me interesa entrar con el string teniendo ese valor, y lo que hará la función entonces es comparar y en caso de encontrar el código asignar la arista a auxiliar, que es una arista que tiene la clase contenedora y que sirve para estos temas auxiliares)

En otro momento puedo necesitar imprimir los nodos, pero no los hijos directos de un nodo, sino toda la rama que sale de un nodo (aclaro que el objetivo es tener un grafo acíclico, cuyo desarrollo desde cualquier nodo es un árbol...no sé si lo he dicho bien):

Código C++:
Ver original
  1. template <typename datonodo_t, typename datoarista_t>
  2. void Grafo<datonodo_t,datoarista_t>::recorrerGrafo(pNodo& inicio, TratarArista& tratamiento)
  3. {
  4.     pArista A;
  5.     if (inicio)
  6.         {
  7.             guardaAristas (inicio);//meto las aristas en la pila
  8.             while (!pila.empty())
  9.                 {
  10.                     A=pila.top();
  11.                     pila.pop();
  12.                     tratamiento(A);
  13.                     recorrerGrafo(A->destino,tratamiento);
  14.                 }
  15.         }
  16. }

Sólo he de añadir al método que recorre el grafo de ésta forma otro objeto de la clase TratarArista, y en caso de querer imprimir actúo como en el caso anterior:
Código C++:
Ver original
  1. void Contenedor::VerArbol()
  2. {
  3.     auxiliar=padre->adyacente;
  4.     TratarArista* tratamiento=new Imprimir ("", auxiliar);
  5.     G.recorrerGrafo(padre, *tratamiento);
  6. }
Bueno, me explico regular, pero dicho queda

Última edición por dehm; 12/02/2014 a las 09:06