• Lunes 18 de Noviembre de 2024, 05:19

Autor Tema:  Funciones De Clase  (Leído 3042 veces)

Ticos

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Funciones De Clase
« en: Martes 6 de Julio de 2004, 16:18 »
0
/*
Como hacer para pasar una función privada de una clase como parametro de una función externa, por ejemplo "setvect" en "dos.h" de "Borland C++ 3.1" o la función que se muestra en el código
*/
#include <stdio.h>

void FuncionExterna(...)
{
   puts("FuncionExterna");
}

void Enlace(void (*Funcion)(...))
{
   Funcion();
}

class Prueba
{
private:
   void FuncionInterna(...)
   {
      puts("FuncionInterna");
   }

public:
   void Llamado(void)
   {
      Enlace(FuncionExterna);
      Enlace(FuncionInterna);   /*Error:
      Member function must be called or its address taken
      Type mismatch in parameter 'Funcion' in call to 'Enlace(void (*)(...))'*/
   }
};

void main(void)
{
   Prueba   PruebaA;

   PruebaA.Llamado();
}

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Funciones De Clase
« Respuesta #1 en: Miércoles 7 de Julio de 2004, 01:32 »
0
Hola.

La única manera que hay de pasar un método de una clase como parámetro a una función ya hecha de C es si el método es estático. Si el método no lo es, o bien diseñas una función que acepte punteros a métodos en vez de usar la función de la librería, o bien le pasas otra función y te olvidas del método.

Si en cambio tú creas una función que quieres que pueda aceptar métodos (no estáticos) de objetos o funciones tienes dos opciones:
  • Sobrecargar la función para que acepte ambos casos.</li>
  • Que la función acepte un functor, con dos clases hijas que hagan de wrapper para un método y para una función.</li>
El método del functor es, para mi, el más elegante y el que más flexibilidad para muchas cosas da, pero también el que más conocimientos de C++ requiere. Por ello te voy a mostrar el otro:
<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->
//
// main.cpp
//

#include <iostream>
#include <string>

using namespace std;

// Esta es nuestra función de prueba
void funcion(string texto)
{
    cout << "Este texto se escribe desde una funcion:" << endl;
    cout << "   " << texto << endl;
}

// Esta es nuestra clase de prueba
class CMiClase
{
public:
    void metodo(string texto)
    {
        cout << "Este texto se escribe desde un metodo:" << endl;
        cout << "   " << texto << endl;
    }
    static void metodoEstatico(string texto)
    {
        cout << "Este texto se escribe desde un metodo estatico:" << endl;
        cout << "   " << texto << endl;
    }
};

// Versión que acepta punteros a funciones
void enlace(void (*pFunc)(string texto))
{
    pFunc("Texto de prueba");
}

// Versión que acepta punteros a métodos
void enlace(CMiClase *pObj, void (CMiClase::*pFunc)(string texto))
{
    (pObj->*pFunc)("Texto de prueba");
}

int main()
{
    // La versión para funciones.
    enlace(funcion);

    // También funciona para métodos estáticos.
    enlace(CMiClase::metodoEstatico);

    // La sintaxis para métodos no estáticos varía y, además, hace
    // falta tener una instancia de la clase.
    CMiClase objeto;
    enlace(&objeto, &CMiClase::metodo);

    cout << "Presione ENTER para finalizar." << endl;
    getchar();
    return 0;
}<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->

Como ves, la sintaxis de a versión para métodos difiere. Además, hay que saber el tipo de objeto al crear la función enlace. Con el método de los functors sólo habría que crear una función enlace y se tratarían todos los casos igual. Si estás interesado en ello dimelo y te posteo cómo se hace.

Un saludo.

Ruben3d

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Funciones De Clase
« Respuesta #2 en: Miércoles 7 de Julio de 2004, 02:20 »
0
um  ya veo , pero la solucion de Ruben es para C++, me gustaria saber como se hace en c... hasta donde he sabido eso no se puede hacer en c... pero una vez hice un ejercicio con Pthreads y habia que enviarle una funcion como parametro.. asi que voy a investigar.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: Funciones De Clase
« Respuesta #3 en: Miércoles 7 de Julio de 2004, 11:36 »
0
Bueno en C teoricamente también es posible....  
Como ejemplo un botón:
La creación de hilos en C se hace mediante la función "_beginthreadex" (que permite cierta independencia con respecto al SO) y su estructura es la siguiente:

unsigned long _beginthreadex(void *seguridad, unsigned int tamaño_pila, unsigned int (__stdcall *rutina)(void *), void *parametro, unsigned int opciones, unsigned int *id_hilo);

Como se ve, la función acepta como parámetro una función de tipo:
unsigned int __stdcall rutina_paralela()
Por cierto, el (void*) como variables que acepta indica que no se sabe el número de parámetros que acepta.

Ya sé que no es lo mismo, pero si al menos parecido.  De todas formas no hay que olvidar que una función es direccionada mediante un apuntador a int, por tanto se debiera poder pasar como parámetro (... 5 minutos más tarde)
Si que es posible:
Código: Text
  1.  
  2. #include&#60;stdio.h&#62;
  3.  
  4. int suma (int a, int b)
  5. {
  6.   return (a+b);
  7. }
  8.  
  9.  
  10. int op(int a, int b, unsigned int (*funcion)(int,int))
  11. {
  12.   int c;
  13.   c=funcion(a,b);
  14.   return c;
  15. }
  16.  
  17.  
  18. void main()
  19. {
  20.   int a,b,c;
  21.  
  22.   a=3;
  23.   b=5;
  24.  
  25.   c=op(a,b,suma);
  26.   printf(&#34;resultado: %d&#34;,c);
  27. }
  28.  
  29.  
Espero que sirva de algo...
Un saludo a todos.
No hay tonto más molesto que el ingenioso.

carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: Funciones De Clase
« Respuesta #4 en: Miércoles 7 de Julio de 2004, 11:40 »
0
Lo siento creo que cometí un error en el post, pues las funciones las declaré globales.... Compruebénlo por favor.
Sorry (aún estoy dormido)
No hay tonto más molesto que el ingenioso.

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Funciones De Clase
« Respuesta #5 en: Miércoles 7 de Julio de 2004, 12:23 »
0
Cita de: "JuanK"
pero la solucion de Ruben es para C++
O se me ha ido mucho la cabeza :P, o Ticos está preguntando cómo hacerlo en C++:
Cita de: "Ticos"
función privada de una clase

Un saludo.

Ruben3d

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Funciones De Clase
« Respuesta #6 en: Miércoles 7 de Julio de 2004, 19:08 »
0
asi es..
no decia eso sino que eme entro al duda de como ahcerlo en c
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Funciones De Clase
« Respuesta #7 en: Miércoles 7 de Julio de 2004, 19:58 »
0
Cita de: "JuanK"
no decia eso sino que eme entro al duda de como ahcerlo en c
:lol: En el ejemplo que puse, es el caso en el que se pasa una función como parámetro. En C es igual.

Un saludo.

Ruben3d

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Funciones De Clase
« Respuesta #8 en: Miércoles 7 de Julio de 2004, 20:15 »
0
lo revisare muy bien, pus hasta donde veo es solo c++;

asi de rapidez y por encimienta me queda la duda de que es PFunc?
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Funciones De Clase
« Respuesta #9 en: Miércoles 7 de Julio de 2004, 21:38 »
0
pFunc es un puntero a una función.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Funciones De Clase
« Respuesta #10 en: Jueves 8 de Julio de 2004, 16:51 »
0
:blink: UMM

pues eso entendi pero me referia a si es propio de algun compildor determinado o de alguna libreria o si es ANSI C o algun otro tipo de estandart, o donde esta definido PFunc... :blink:
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Funciones De Clase
« Respuesta #11 en: Jueves 8 de Julio de 2004, 20:09 »
0
pFunc es el parámetro de la función enlace, y está declarado según el estándar de C. Cuando se llama a la función enlace se le pasa como parámetro la dirección de memoria de otra función, que es ejecutada desde el interior a través de pFunc.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Funciones De Clase
« Respuesta #12 en: Viernes 9 de Julio de 2004, 05:29 »
0
umm que bueno , gracias!!!
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io