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

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda sobre sintaxis: Un argumento que hace referencia a una funcion...
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda sobre sintaxis: Un argumento que hace referencia a una funcion...  (Leído 2,125 veces)
digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Duda sobre sintaxis: Un argumento que hace referencia a una funcion...
« en: 17 Abril 2019, 04:33 am »

Hola!..

Estoy practicando Unreal y QT Creator, en ambos he visto esta sintaxis:


Código
  1.  
  2. void unaFuncionCualquiera(){
  3.  
  4.     unaClase.unMetodo(&ClaseA::unaFuncionB);  //este argumento..
  5.  
  6. }
  7.  
  8.  
  9. void ClaseA::unaFuncionB(){
  10.     //hacer algo
  11. }
  12.  

En Unreal se manipulan los controles de esta forma.
En QT se conecta un botón con una función...

Entiendo el efecto que tiene, pero que tipo de parámetro es?,, como se denomina este tipo de parámetros?



Saludos y gracias.


« Última modificación: 17 Abril 2019, 04:34 am por digimikeh » En línea

Dungeons & dragons;
dragons.Attack();
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Duda sobre sintaxis: Un argumento que hace referencia a una funcion...
« Respuesta #1 en: 17 Abril 2019, 11:23 am »

Son punteros a funciones. Es una forma de hacer que una función pueda hacer muchas cosas diferentes, dependiendo del método o función que se les pase.
Es una forma de hacer las cosas genéricas.
Sólo importante que la función o método que se le pase cómo parámetro coincida con la que se espera.

Un ejemplo en C:
Código
  1. #include <stdio.h>
  2.  
  3. int suma(int a, int b) {
  4.    return a + b;
  5. }
  6.  
  7. int resta(int a, int b) {
  8.    return a - b;
  9. }
  10.  
  11. int calcular(int (*funcion)(int, int), int a, int b) {
  12.    return funcion(a, b);
  13. }
  14.  
  15. int main () {
  16.    int a = 3;
  17.    int b = 2;
  18.  
  19.    printf("%d + %d = %d\n", a, b, calcular(suma, a, b));
  20.    printf("%d - %d = %d\n", a, b, calcular(resta, a, b));
  21. }

Esto devuelve:
Citar
3 + 2 = 5
3 - 2 = 1


En línea

digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Re: Duda sobre sintaxis: Un argumento que hace referencia a una funcion...
« Respuesta #2 en: 17 Abril 2019, 16:21 pm »

Ok, entiendo!..gracias..
Entonces las funciones también estarían ocupando un espacio en la memoria?
En línea

Dungeons & dragons;
dragons.Attack();
Loretz

Desconectado Desconectado

Mensajes: 117


Ver Perfil
Re: Duda sobre sintaxis: Un argumento que hace referencia a una funcion...
« Respuesta #3 en: 17 Abril 2019, 17:18 pm »

Citar
Entonces las funciones también estarían ocupando un espacio en la memoria?

Los punteros a funciones sí, pero en tu caso no tienes un puntero a función sino un "puntero a función miembro", que es diferente.

Un puntero a función miembro no apunta a nada hasta que no se cree el objeto y se defina a qué función apuntará, y como es "implementation defined", dependerá del compilador si lo implementa como un puntero u otra cosa.

La sintaxis es un poco compleja; un ejemplo simple ya lo muestra:

Código
  1. #include <iostream>
  2.  
  3. class UnaClase {
  4. public:
  5.    void unMetodo()
  6.    {
  7.        std::cout << "UnaClase::unMetodo()\n";
  8.    }
  9. };
  10.  
  11. void unaFuncion(UnaClase* p, void(UnaClase::* pmf)())
  12. {
  13.    (p->*pmf)();  ///< recien aqui se define a que funcion de que objeto apunta el "puntero a funcion miembro" (pmf)
  14. }
  15.  
  16. int main()
  17. {
  18.    UnaClase unaClase;
  19.    unaFuncion(&unaClase, &UnaClase::unMetodo);  ///< debe invocarse con el objeto ademas del "puntero a funcion miembro";
  20.                                                 ///< y si la funcion miembro toma parametros, tambien habra que pasarselos.
  21. }

En línea

digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Re: Duda sobre sintaxis: Un argumento que hace referencia a una funcion...
« Respuesta #4 en: 17 Abril 2019, 21:56 pm »

Se ve un tanto complejo pero voy entendiendo.

Bajo que circunstancias se puede usar puntero a función y método miembro?

Gracias
En línea

Dungeons & dragons;
dragons.Attack();
Loretz

Desconectado Desconectado

Mensajes: 117


Ver Perfil
Re: Duda sobre sintaxis: Un argumento que hace referencia a una funcion...
« Respuesta #5 en: 18 Abril 2019, 03:07 am »

Citar
Bajo que circunstancias se puede usar puntero a función y método miembro?

En C++ hay funciones pero no "métodos", algunas veces se dice así por costumbre adquirida en otros lenguajes, pero en C++ sólo hay funciones, algunas serán "member functions" y otras no, pero no hay más.

Y francamente no tengo una respuesta de esas iluminadoras, pero creo que en general se usa un puntero a función miembro más o menos de la manera en que se usa un puntero a función.

Como has estado viendo, QT Creator implementa sus event handlers usando punteros a funciones miembro.

Muchas veces puede usarse otro mecanismo para conseguir el mismo resultado, comúnmente apelando a las funciones virtuales.

También, en la biblioteca estándar están std::function que puede inicializarse con una función miembro, y está std::bind, que devuelve un function object que puede invocar una función (miembro o no), con sus parámetros de llamada asociados.

Aunque no encuentro un ejemplo simple donde pueda mostrarse fácilmente un uso indiscutible, se puede ver su uso en la aplicación del "Open-close principle" https://en.wikipedia.org/wiki/Open%E2%80%93closed_principle; por ejemplo, en "The Safe Bool Idiom": https://www.artima.com/cppsource/safebool2.html


« Última modificación: 18 Abril 2019, 03:16 am por Loretz » En línea

digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Re: Duda sobre sintaxis: Un argumento que hace referencia a una funcion...
« Respuesta #6 en: 20 Abril 2019, 21:02 pm »

Hombre, gracias por las explicaciones. :D
En línea

Dungeons & dragons;
dragons.Attack();
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Referencia a argumento en funcion.-
Programación Visual Basic
mdg 1 2,143 Último mensaje 9 Agosto 2007, 23:43 pm
por CeLaYa
funcion como argumento a otra funcion
Programación C/C++
Dark Invader 5 4,828 Último mensaje 29 Junio 2011, 20:52 pm
por Dark Invader
Referencia de variable y objeto tras ingresarse como argumento
Java
Fabi0lo 2 2,457 Último mensaje 3 Abril 2012, 15:32 pm
por Fabi0lo
Estructuras como argumento de funcion
Programación C/C++
BigMuff 1 1,279 Último mensaje 31 Julio 2018, 13:18 pm
por MAFUS
Poka: Esta imágen a que hace referencia?
Foro Libre
Mudereded401 3 3,195 Último mensaje 25 Febrero 2021, 01:05 am
por Mudereded401
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines