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


 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Igualar Funciones
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Igualar Funciones  (Leído 4,552 veces)
Kropt32

Desconectado Desconectado

Mensajes: 34


Ver Perfil
Igualar Funciones
« en: 22 Enero 2010, 23:44 »

Pues nada, me preguntaba si era posible en C o C++ igualar funciones


Código:
/*
...
*/
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 Desconectado

Mensajes: 25



Ver Perfil
Re: Igualar Funciones
« Respuesta #1 en: 23 Enero 2010, 00:00 »

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

Desconectado Desconectado

Mensajes: 174



Ver Perfil WWW
Re: Igualar Funciones
« Respuesta #2 en: 23 Enero 2010, 00:14 »

que quieres hacer exactamente? es decir, para que quieres hacer eso? de seguro hay otra alternativa  ::)

En línea

[L]ord [R]NA


Desconectado Desconectado

Mensajes: 1.513


El Dictador y Verdugo de H-Sec


Ver Perfil WWW
Re: Igualar Funciones
« Respuesta #3 en: 23 Enero 2010, 00:32 »

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 Desconectado

Mensajes: 324


tengo 14 invitaciones para locker-z enviar mp


Ver Perfil
Re: Igualar Funciones
« Respuesta #4 en: 23 Enero 2010, 07:54 »

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 Desconectado

Mensajes: 354


Ver Perfil
Re: Igualar Funciones
« Respuesta #5 en: 23 Enero 2010, 11:22 »

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 Desconectado

Mensajes: 324


tengo 14 invitaciones para locker-z enviar mp


Ver Perfil
Re: Igualar Funciones
« Respuesta #6 en: 23 Enero 2010, 11:54 »

ya... si no digo lo contrario... por eso digo que retorna un bool
En línea

toruk makto

Desconectado Desconectado

Mensajes: 25



Ver Perfil
Re: Igualar Funciones
« Respuesta #7 en: 23 Enero 2010, 12:33 »

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  :xD)

Saludos!!
En línea

MazarD
Colaborador
***
Desconectado Desconectado

Mensajes: 884


mazard.info


Ver Perfil WWW
Re: Igualar Funciones
« Respuesta #8 en: 23 Enero 2010, 12:56 »

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:

Código
  1. typedef string (*punteroFuncion)(void);
  2.  
  3. string funcionA(void) { return "soy la funcion a"; }
  4. string funcionB(void) { return "soy la funcion b"; }
  5.  
  6. int main()
  7. {
  8. punteroFuncion pf;
  9. pf=funcionA;
  10. cout << pf();
  11. pf=funcionB;
  12. cout << pf();
  13. return 0;
  14. }

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

-Learn as if you were to live forever, live as if you were to die tomorrow-

http://www.mazard.info
http://twitter.com/MazarD
irc://irc.freenode.org/elhacker.net
Kropt32

Desconectado Desconectado

Mensajes: 34


Ver Perfil
Re: Igualar Funciones
« Respuesta #9 en: 24 Enero 2010, 23:57 »

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:

Código:

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:

Código:
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 Desconectado

Mensajes: 996


STOP CENSORSHIP


Ver Perfil WWW
Re: Igualar Funciones
« Respuesta #10 en: 25 Enero 2010, 05:04 »

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

RSA/RSA 4096 confiable x-hkp://keys.keysigning.org 789D025D<<back|track>> user
Kropt32

Desconectado Desconectado

Mensajes: 34


Ver Perfil
Re: Igualar Funciones
« Respuesta #11 en: 25 Enero 2010, 15:00 »

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...

Código:
#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 Desconectado

Mensajes: 996


STOP CENSORSHIP


Ver Perfil WWW
Re: Igualar Funciones
« Respuesta #12 en: 25 Enero 2010, 20:16 »

De nadas, enviale un MP a Eternal Idol así da el tema por cerrado y solucionado

Saludos
En línea

RSA/RSA 4096 confiable x-hkp://keys.keysigning.org 789D025D<<back|track>> user
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
¿Podrá Google+ igualar a Facebook?
Noticias
wolfbcn 3 1,032 Último mensaje 3 Agosto 2011, 18:27
por O-LLOS-O
Powered by SMF 1.1.19 | SMF © 2006-2008, Simple Machines