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

PUNTERO A MÈTODO, problema

Estas en el tema de PUNTERO A MÈTODO, problema en el foro de C/C++ en Foros del Web. TENGO LO SIGUIENTE Busqueda.h: Código: #ifndef CLASECITA_H_INCLUDED #define CLASECITA_H_INCLUDED #include "BinaryTree.cpp" class Busqueda{ private: int x; int y; public: int getX(); void output2(int a); }; ...
  #1 (permalink)  
Antiguo 30/06/2010, 01:16
 
Fecha de Ingreso: agosto-2005
Mensajes: 9
Antigüedad: 18 años, 8 meses
Puntos: 0
Pregunta PUNTERO A MÈTODO, problema

TENGO LO SIGUIENTE
Busqueda.h:

Código:
#ifndef CLASECITA_H_INCLUDED
#define CLASECITA_H_INCLUDED
#include "BinaryTree.cpp"
class Busqueda{
    private:
    int x;
    int y;

    public:
    int getX();
    void output2(int a);
};

#endif // CLASECITA_H_INCLUDED

Busqueda.cpp:

Código:
#include <iostream>
#include <string>
#include "clasecita.h"
#include "BinaryTree.cpp"
using namespace std;
#ifndef NULL
#define NULL 0
#endif

void output1(int a){
    cout<<a;
}

void Busqueda::output2(int a){
    cout<<a;
}

 int Busqueda::getX(){
    return this->x;
    BinTree<int> arbol;
    arbol.SetInOrder(output1);
    arbol.SetInOrder(output2); //Linea 21
    arbol.InOrder();
}
Lo que tengo es una la clase Busqueda definida en el .h y desarrollada en el .cpp. Ademàs el .cpp tiene dos funciones las cuales se van a usar como parametro para un mètodo que requiere funciones como parametro. El tema es que cuando hago arbol.SetInOrder(output1) siendo output1 una funciòn desarrollada en ese mismo .cpp no tira error. Pero cuando hago arbol.SetInOrder(output2), siendo output2 un mètodo pùblico de la clase Busqueda, si tira el siguiente error:

Cita:
Busqueda.cpp|21|error: no matching function for call to `BinTree<int>::SetInOrder(<unknown type>)'|

BinaryTree.cpp|173|note: candidates are: void BinTree<type>::SetInOrder(void (*)(type)) [with type = int]|
EL mètodo SetInOrder toma como parametro: void (*funcion) (type data). Por què me permite pasarle a SetInOrder como parametro una funciòn de ese àmbito y no a su mètodo?.. Habia leido algo que para pasar un puntero de una funcion es distinto que pasar un puntero de un mètodo. Como lo hago entocnes?? MUCHAS GRACIAS!
  #2 (permalink)  
Antiguo 30/06/2010, 10:30
 
Fecha de Ingreso: enero-2008
Mensajes: 229
Antigüedad: 16 años, 2 meses
Puntos: 1
Respuesta: PUNTERO A MÈTODO, problema

El problema es que los metodos no estaticos de una clase no se crean hasta que instancia una clase. Así que al tratar de determinar la direccion de la funcion no la encuentra. Se me ocurren tres posibles soluciones.
1. Que tu metodo output2 sea estatica
2. Que tu metodo output2 sea una funcion amiga
3. Que crees una clase-funcion.
intenta las dos primeras y platicas k paso
  #3 (permalink)  
Antiguo 01/07/2010, 08:35
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: PUNTERO A MÈTODO, problema

Yo hace poco tuve el mismo problema, y leyendo llegue a la conclusion que C++ no permite puntero a un metodo de una clase.

Lo que puedes hacer es algo muy parecido a "output1". Lo puedes dejar asi si solo quieres imprimir el numero, pero si lo que quieres es trabajar con tu clase, pues define a output1 asi:

void output1(void * obj){
Busqueda * objeto = (Busqueda * ) obj.
cout<<obj.a;
}

La idea es pasarle un puntero al objeto, en esa funcion castearlo a la clase que necesites y puede llamar a sus metodos.

Despues al metodo SetInOrder lo defines asi:

typedef void (*VoidFunctionPtr)(void* arg);

BinTree::SetInOrder(VoidFunctionPtr func);

Con todo eso deberia andar. Yo solucione mis problemas asi.
  #4 (permalink)  
Antiguo 01/07/2010, 18:06
 
Fecha de Ingreso: agosto-2005
Mensajes: 9
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: PUNTERO A MÈTODO, problema

Gracias a los dos. No quiero ser muy molesto Sam.. pero me podrias dar el ejemplo concreto con el còdigo q enviè en un principio?.. es que no llego a entender por completo a lo que te referis.
Por ej cuando me ponès: "BinTree::SetInOrder(VoidFunctionPtr func);" ..
SetInOrder ya està definida y solo acepta parametros del tipo: (void (*)(type)) , osea una fucniòn con un paorametro del tipo type.. en el caso de mi ejemplo es int (ya q definì a arbol como arbol<int>). Desde ya muy agradecido!
  #5 (permalink)  
Antiguo 01/07/2010, 19:37
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: PUNTERO A MÈTODO, problema

necesitaria la definicion correcta de BinTree...
  #6 (permalink)  
Antiguo 01/07/2010, 20:14
 
Fecha de Ingreso: agosto-2005
Mensajes: 9
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: PUNTERO A MÈTODO, problema

Código:
template <class type> class BinTree
{
public:
	BinTree();
	~BinTree();

	BinTreeNode<type>* Add(type newData);
	void SetIsGreater(bool (*isGreater)(type data1, type data2));
	void InOrder();
	void SetInOrder(void (*inOrder) (type data));
	bool isEmpty();
	type searchElement(string key);
	void SetCompareKey(int (*compareKey) (type data, string key));

private:
	BinTreeNode<type>* root;
	bool (*isGreater) (type data1, type data2);
	int (*compareKey) (type data, string key);
	void (*inOrder) (type data1);

};

// SET THE COMPARE FUNCTION
template <class type> void BinTree<type>::SetIsGreater(bool (*isGreater) (type data1, type data2))
{
	this->isGreater = isGreater;
}
  #7 (permalink)  
Antiguo 01/07/2010, 20:25
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: PUNTERO A MÈTODO, problema

En C++ los punteros a metodos existen y representan un desplazamiento respecto a un objeto. Hay operadores nuevos para este caso.

Aqui un ejemplo corto:


Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class C
  5. {
  6.  public:
  7.    void m()
  8.    {
  9.       cout << "Soy el metodo m\n";
  10.    }
  11. };
  12.  
  13. main()
  14. {
  15.    C* pobj = new C;
  16.  
  17.    void (C::*pm)() = &C::m;   // <-- puntero a metodo
  18.  
  19.    (pobj->*pm)();     // invocacion del metodo usando el puntero
  20. }
  #8 (permalink)  
Antiguo 01/07/2010, 21:35
 
Fecha de Ingreso: agosto-2005
Mensajes: 9
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: PUNTERO A MÈTODO, problema

Mucho conocimiento de puntero a funciones no tengo.. por eso tengo estos problemas.
CalgaryCorpus, en mi ejemplo està bien hecho?:

Código:
class Busqueda{
    private:
    int x;
    int y;

    public:
    int getX();
    void output2(int a){
        cout<<a;
    }

};
Código:
int main(){
    Busqueda* una_busqueda = new Busqueda;
    void (Busqueda::*punteroOutput2)(int) = &Busqueda::output2;

    BinTree<int> arbol;
    arbol.SetInOrder(una_busqueda->*punteroOutput2);
    arbol.InOrder();
}

Etiquetas: puntero
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 09:51.