Autor
|
Tema: Duda sobre sintaxis: Un argumento que hace referencia a una funcion... (Leído 2,450 veces)
|
digimikeh
Desconectado
Mensajes: 191
|
Hola!.. Estoy practicando Unreal y QT Creator, en ambos he visto esta sintaxis: void unaFuncionCualquiera(){ unaClase.unMetodo(&ClaseA::unaFuncionB); //este argumento.. } void ClaseA::unaFuncionB(){ //hacer algo }
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
Mensajes: 1.603
|
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: #include <stdio.h> int suma(int a, int b) { return a + b; } int resta(int a, int b) { return a - b; } int calcular(int (*funcion)(int, int), int a, int b) { return funcion(a, b); } int main () { int a = 3; int b = 2; printf("%d + %d = %d\n", a , b , calcular (suma , a , b )); printf("%d - %d = %d\n", a , b , calcular (resta , a , b )); }
Esto devuelve: 3 + 2 = 5 3 - 2 = 1
|
|
|
En línea
|
|
|
|
digimikeh
Desconectado
Mensajes: 191
|
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
Mensajes: 117
|
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: #include <iostream> class UnaClase { public: void unMetodo() { std::cout << "UnaClase::unMetodo()\n"; } }; void unaFuncion(UnaClase* p, void(UnaClase::* pmf)()) { (p->*pmf)(); ///< recien aqui se define a que funcion de que objeto apunta el "puntero a funcion miembro" (pmf) } int main() { UnaClase unaClase; unaFuncion(&unaClase, &UnaClase::unMetodo); ///< debe invocarse con el objeto ademas del "puntero a funcion miembro"; ///< y si la funcion miembro toma parametros, tambien habra que pasarselos. }
|
|
|
En línea
|
|
|
|
digimikeh
Desconectado
Mensajes: 191
|
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
Mensajes: 117
|
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
Mensajes: 191
|
Hombre, gracias por las explicaciones.
|
|
|
En línea
|
Dungeons & dragons; dragons.Attack();
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Referencia a argumento en funcion.-
Programación Visual Basic
|
mdg
|
1
|
2,266
|
9 Agosto 2007, 23:43 pm
por CeLaYa
|
|
|
funcion como argumento a otra funcion
Programación C/C++
|
Dark Invader
|
5
|
5,175
|
29 Junio 2011, 20:52 pm
por Dark Invader
|
|
|
Referencia de variable y objeto tras ingresarse como argumento
Java
|
Fabi0lo
|
2
|
2,643
|
3 Abril 2012, 15:32 pm
por Fabi0lo
|
|
|
Estructuras como argumento de funcion
Programación C/C++
|
BigMuff
|
1
|
1,463
|
31 Julio 2018, 13:18 pm
por MAFUS
|
|
|
Poka: Esta imágen a que hace referencia?
Foro Libre
|
M401
|
3
|
3,494
|
25 Febrero 2021, 01:05 am
por M401
|
|