![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
|
Buenas!
Tengo la siguiente estructura de clases (obviamente es un esquema para representar la situación, no es mi código original): Código:
class A
{
public:
A(void (*vEvent) (A *, char)): event_A(vEvent) {};
~A() {};
void (*publicEvent_A) (A *);
private:
void (*event_A) (A *, char);
void myProcedure ()
{
event_A (this, 'x');
}
};
class B
{
public:
B():
myA(event_B)
{
/* myA = new A(event_B); */
myA->publicEvent_A = myProcedure_B;
};
~B();
private:
A *myA;
void event_B (A *p1, char p2)
{
// hago cosassss...
};
void myProcedure_B (A *sender)
{
sender = sender; //do anything
};
};
main.cpp:20: error: argument of type ‘void (B:: )(A*, char)’ does not match ‘A*’ main.cpp:23: error: argument of type ‘void (B:: )(A*)’ does not match ‘void (*)(A*)’ Entiendo lo que quiere decir, pero si por ejemplo solo declaro la clase A y en el main.cpp escribo: Código:
void eventoA (A *sender, char p)
{
// codigo
}
void otroEventoA (A* sender)
{
// codigo
}
int main ()
{
A *myA = new A(eventoA);
myA->publicEventA = otroEventoA;
}
¿Alguien puede decirme cómo corregir el error inicial (con ambas clases implementadas según el primer código)? Tampoco deseo cambiar los niveles de seguridad mostrados, lo que está en public y private debe permanecer tal cual. Gracias de antemano!!
__________________
Ni la utilidad del mentir es sólida, ni el mar de la verdad perjudica mucho tiempo. |
|
#2
|
||||
|
||||
|
El problema es que el constructor espera un puntero a una función, sin embargo tú le estás pasando un método. No es lo mismo ya que los métodos están asociados a objetos, mientras que con las funciones no es así.
¿La solución? Pues no estoy seguro porque hace eones que no programo en C++ (ni ganas tengo) pero en ObjectPascal es posible pasar métodos como parámetros y luego asociarlos a objetos. No recuerdo si con C++ podía hacerse, o si hay otra solución, pero no me apetece pensar más.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi! - BAScript - Multi Language Scriptable Development Environment |
|
#3
|
|||
|
|||
|
mmm me he liado tanto
![]() ![]() , con las simples llamadas a este que llama a este otro que no se si termine con más dudas que respuestas, pero la cosa creo que va por enviar algo que no existe, es decir en la creación de B aún no hay ninguna dirección que apunte a event_B (esta es la única explicación a la que doy fe), por ende la solución sería crear punteros del tipo al método que usas, pero que estén por encima de B o que se creen antes, después le asignas la función y así ya jala. La cuestión es que cosas ases en event_B, algo así .Código:
class A
{
public:
A( void( * vEvent )( A* , char ) ) : event_A( vEvent ){ };
~A( ){ };
void( *publicEvent_A )( A* );
private:
void( *event_A )( A*, char );
void myProcedure( )
{
event_A( this, 'x' );
}
};
typedef void( *Fun )( A * p1, char ca );
typedef void( *Fun2 )( A * a );
Fun aa;
Fun2 bb;
class B
{
public:
B( )
{
myA = new A( aa );
myA->publicEvent_A = bb;
};
~B( );
private:
A* myA;
void myProcedure_B( A* sender )
{
sender = sender;
};
};
Pd. Estimado Ñuño Martínez desde la ignorancia pregunto, función no es lo mismo que método? Ambos tienen parámetros variables y retornos variables, siendo la única diferencia el paradigma de programación (estructurada u orientada a objetos, es decir solo palabras no funcionalidad), porque hasta donde yo he programado da lo mismo pasar una función X a un OnClick X. Pd2. Sería interesante que alguien resolviera el hilo y dijera que está pasando ya que sí que no me funciona pero no le encuentro falla lógica. |
|
#4
|
||||
|
||||
|
Cita:
Según la definición más pura de la POO, los métodos implementan la respuesta a los mensajes que se envían a un objeto. La confusión quizá provenga en la forma en la que C++, Object Pascal y similares implementan los métodos, que lo hacen como "llamadas a función con parámetro implícito", this en un caso y SELF en el otro. Sin embargo lenguajes como Small-Talk u Objective C los métodos no se implementan como si fueran funciones por lo que la diferencia está más clara. Es más, en Objective C la nomenclatura es diferente para funciones y para métodos, mientras que en Small-Talk ni siquiera existen las funciones. Para que veas, te pongo un ejemplo de método en Objective C: Código:
- (int)method:(int)i
{
return [self square_root:i];
}
Para que lo veas más claro, cuando escribimos esto en C++: Código:
UnObjeto.Metodo (Parametro, OtroParametro); ElObjeto->Metodo (Parametro, OtroParametro); Código:
((*(UnObjeto.Metodo)) (&UnObjeto, Parametro, OtroParametro)); ((*(ElObjeto->Metodo)) (ElObjeto, Parametro, OtroParametro));
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi! - BAScript - Multi Language Scriptable Development Environment Última edición por Ñuño Martínez fecha: 13-04-2011 a las 10:35:19. |
|
#5
|
|||
|
|||
![]() ![]() llevo tanto tiempo programando en un solo lenguaje que a veces olvido que el mundo no está escrito solo en C++. Gracias por despejarme ahora entiendo más que un método es algo así como la representación de los mensajes enviados y recibidos a un objeto, y una función no tienen nada que ver con esto a pesar de que reciban o regresen punteros de objetos (o eso capte en este instante, en cualquier caso nunca está de más pasarme por google a redefinir algunos de mis conceptos ), otra vez gracias . |
![]() |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| parámetros en funciones RGB y HSL | Norum | Gráficos | 5 | 12-02-2008 17:49:43 |
| Establecer parametros determinados en funciones y procedimientos | emeceuy | Varios | 8 | 03-09-2007 19:23:50 |
| Funciones por parametros... | omar_e_rc | Varios | 2 | 27-03-2005 23:12:27 |
| Funciones y parámetros Fast Report | sur-se | Impresión | 1 | 18-08-2004 12:38:44 |
| Enviar estructuras como parametros a funciones Oracle | SLAKE | Conexión con bases de datos | 0 | 02-10-2003 17:14:05 |
|