Autor
|
Tema: Igualar Funciones (Leído 3,662 veces)
|
Kropt32
Desconectado
Mensajes: 34
|
Pues nada, me preguntaba si era posible en C o C++ igualar funciones /* ... */ std::string funcion_a(void) { return "a"; }
std::string funcion_b(void) { return "b"; }
/* ... */
funcion_a = funcion_b; // Esto por supuesto no funciona
// Y esto que imprima en lugar de "a", una "b" std::cout << funcion_a() << std::endl;
/* ... */
|
|
|
|
|
En línea
|
En las pistolas, fíjense, a cada disparo el cañon recula, como asustado por lo que acaba de hacer.
|
|
|
toruk makto
Desconectado
Mensajes: 25
|
Yo diria que no, porque al sacar por pantalla, vuelves a llamar a la funcion. En todo caso, creo que funcionaria si declarases otra variable string que tomase como valor lo que devuelve la funcion. Pero puedes comprobarlo tu mismo, haz dos funciones que hagan lo que tu explicas, una que te devuelva una a, y la otra una b, e intenta hacerlo.
Saludos!!
|
|
|
|
|
En línea
|
|
|
|
|
Zzombi
|
que quieres hacer exactamente? es decir, para que quieres hacer eso? de seguro hay otra alternativa 
|
|
|
|
|
En línea
|
|
|
|
[L]ord [R]NA
Desconectado
Mensajes: 1.513
El Dictador y Verdugo de H-Sec
|
Claro que deben de existir alternativas... La pregnta es que se quiere hacer (Hacer que la funcion A realice lo que hace la funcion B) en ese caso la funcion A seria un puntero a una funcion... que tomaria la direccion de la funcion B y la ejecutaria.
Verdaderamente no se me ocurre para que quiere hacer esto si no es lo que explico mas arriba
|
|
|
|
|
En línea
|
|
|
|
O-LLOS-O
Desconectado
Mensajes: 324
tengo 14 invitaciones para locker-z enviar mp
|
no!! una funcion no es una variable no almazena informacion por lo tanto no lo que si que puedes hacer es esto:
funcion_A == funcion_B
Lo cual debuelve un bool
|
|
|
|
« Última modificación: 23 Enero 2010, 11:55 por O-LLOS-O »
|
En línea
|
|
|
|
.;.
Desconectado
Mensajes: 354
|
no!! una funcion no es una variable no almazena infoemacion por lo tanto no lo que si que puedes hacer es esto:
funcion_A == funcion_B
Lo cual debuelve un bool
Eso que dices lo único que hace es demostrar si es lo mismo. Y punto.
|
|
|
|
|
En línea
|
|
|
|
O-LLOS-O
Desconectado
Mensajes: 324
tengo 14 invitaciones para locker-z enviar mp
|
ya... si no digo lo contrario... por eso digo que retorna un bool
|
|
|
|
|
En línea
|
|
|
|
toruk makto
Desconectado
Mensajes: 25
|
Coincido con LLOS, solo funciona al hacer comparaciones, pero no al "igualarlas" (que por cierto, un profe de programación que he tenido nos tenía prohibido desde el primer dia, decir que dos cosas se "igualan", lo que hace, es que "A toma como valor B", no viene a cuento, pero me ha traido recuerdos de los insultos que expendía por estas cosas  ) Saludos!!
|
|
|
|
|
En línea
|
|
|
|
|
MazarD
|
En un principio si nos explicas mejor el problema te ayudaremos mejor, de todos modos tomando literalmente lo que quieres se puede hacer algo parecido, como ya ha dicho R.N.A con punteros a funciones. Un ejemplo: typedef string (*punteroFuncion)(void); string funcionA(void) { return "soy la funcion a"; } string funcionB(void) { return "soy la funcion b"; } int main() { punteroFuncion pf; pf=funcionA; cout << pf(); pf=funcionB; cout << pf(); return 0; }
Lo he escrito al vuelo asi que es posible que de algun error al compilar, esto se suele utilizar principalmente para callbacks.
|
|
|
|
« Última modificación: 23 Enero 2010, 13:08 por MazarD »
|
En línea
|
|
|
|
Kropt32
Desconectado
Mensajes: 34
|
En primer lugar siento no haber podido contestar antes... Me imaginaría que una de las respuestas sería el tema de puntero a función, y sinceramente, yo hubiera contestado igual, no me he sabido explicar... De hecho, creo que ni me he explicado... Me arriesgaría a decir que son una especie de delegados lo que busco... A base de ejemplos creo que se me entenderá mejor... En Visual Basic por ejemplo, o Visual C++ al hacer un doble click en un botón en el diseño del formulario pasa a la parte de código y automáticamente pone el cursor para escribir dentro de una función que ha creado Button1_Click() por ejemplo... Que maneja lo que ocurre al hacer clic en Button1 Pues básicamente lo que quería era hacer eso... En la práctica: class Clase { public: Clase(){}
void Metodo() { evento(); } void evento() { cout << "Evento en clase" << endl; } };
void eventoMain();
int main() { Clase miClase;
// Convertir de alguna forma la función evento() de la clase Clase // en eventoMain() para poder editar el codigo del evento sin tener que // crear una clase derivada...
miClase.Metodo();
return 0; }
void eventoMain() { cout << "Evento en main" << endl; }
Y que la salida a ese programa sea: Evento en main
Creo que esta vez se entiende un poco mejor... Nada más, espero que podáis echarme una mano. Muchas gracias.
|
|
|
|
« Última modificación: 24 Enero 2010, 23:59 por Kropt32 »
|
En línea
|
En las pistolas, fíjense, a cada disparo el cañon recula, como asustado por lo que acaba de hacer.
|
|
|
D4RIO
Desconectado
Mensajes: 996
STOP CENSORSHIP
|
Pues basado en el ejemplo de VisualC++, te diré que no necesitas cambiar funciónes, solo necesitas asociar al botón con sus datos: Lugar en el formulario... función llamada por cada evento...
El caso del code que propones es totalmente diferente, en ese caso lo más conveniente es que "Metodo" sea un puntero, inicialmente asociado a "evento", y así lo podrás cambiar.
Tan simple como eso. Si tienes dudas pregunta. Yo uso mucho esto en mi trabajo para establecer manejadores de eventos. También podrías implementar el patrón de factory en casos de diversificación según el evento.
Un saludo
|
|
|
|
|
En línea
|
|
|
|
Kropt32
Desconectado
Mensajes: 34
|
La función metodo(); por supuesto, no solo llama a evento(); por eso no puedo crearla como puntero unicamente Ya está... Mi idea estaba muy encaminada, el último post ha terminado de abrirme los ojos... #include <iostream>
using namespace std;
class Clase { public: Clase() { ptr_onMetodo = onMetodo; } ~Clase(){}
bool Metodo(void) { cout << "Metodo." << endl; ptr_onMetodo(); } static bool onMetodo(void) { cout << "Evento en Clase" << endl; return true; }
bool (*ptr_onMetodo)(void); };
bool onMetodoMain(void);
int main(int argc, char *argv[]) { Clase miClase; miClase.ptr_onMetodo = onMetodoMain; miClase.Metodo(); fflush(stdin); cin.get(); return EXIT_SUCCESS; }
bool onMetodoMain(void) { cout << "Evento en Main" << endl; return true; }
Con eso, puedo manejar el evento que ocurre al hacer Metodo(); desde main... Nada más, muchas gracias a todos.
|
|
|
|
|
En línea
|
En las pistolas, fíjense, a cada disparo el cañon recula, como asustado por lo que acaba de hacer.
|
|
|
D4RIO
Desconectado
Mensajes: 996
STOP CENSORSHIP
|
De nadas, enviale un MP a Eternal Idol así da el tema por cerrado y solucionado
Saludos
|
|
|
|
|
En línea
|
|
|
|
|
|