C++: problema con funciones static

DArgo

Estoy desarrollando una aplicación gráfica para el envío de SMS (ya lo comenté en otro post) y ahora me ha llegado el turno del 20% (la gran regla de la programación: 80% del trabajo en el 20% del tiempo y el 20% del trabajo en el 80% de tiempo).

El problema lo tengo en el uso y modificación de variables de una clase dentro de funciones static. Ya sé que para poder modificar variables de una clase desde funciones static hay que indicar primero el objeto de la clase, pero no sé que puede ocurrir.
Exactamente, en mi programa tengo una declaración del tipo:

Sms *window = new Sms();

Y dentro de la clase, en la parte privada, tengo una variable declarada del tipo Agenda (una clase mia), a la que quiero acceder desde la función estática. He probado a poner infinidad de cosas... y siempre me da el mismo error:

uso inválido del miembro ‘Sms::datosAgenda’ en la función miembro

He probado a pasarle a esa función el puntero this, ya que las funciones static no pueden acceder a él. El problema de esto radica en que el puntero this se lo tengo que pasar de forma que el tipo de datos sea void *. He probado a pasarlo a void *, pero luego a la hora de recuperarlo, ¿como hago la conversion?

PD: A ver si me ayudais a solucionarlo y cuelgo el programa y el codigo fuente para vuestro disfrute :)

Pr0xNT4

Bueno no es que entienda mucho de C++ aunq estoy comenzando con la POO. Te has mirado bien que tengas permisos para llamar a una funcion de la parte como tu dices "privada", puede que tengas que especificarlo public??

r2d2rigo

Ahi esta el problema, para que otras funciones puedan acceder a tu pSMS->datosAgenda, este tiene que ser public. Y si lo casteas a void, el inverso es castearlo a DatosAgenda.

HacerFuncionUno((void)pSMS->datosAgenda);
HacerFuncionDos((DatosAgenda
)valorEnVoidDevueltoPorOtraFuncion);

EDIT: las funciones de ejemplo no estaban tan bien como queria ^'

snoozed21

#3 cuando dices castearlo te refieres a un casting ?

r2d2rigo

Si snoozed, castear = hacer un casting... vale, mi lenguaje no es muy ortodoxo :P

DArgo

Ya me han dicho como se hace. Es por problemas con el FLTK...
En mi función, yo le pasaba como parámetros de entrada un tipo de datos Fl_Widget *w y void *data... pues bien, lo que tenia que hacer era esto:

Fl_Browser *vs = (Fl_Browser *)w;

Y luego poner:

vs->datosAgenda->value();

Y problema solucionado. Muchas gracias a todos! :D

DArgo

Ahora tengo otro problema. Para mi programa de SMS, utilizo una clase mia llamada Agenda, que extrae datos de un fichero y los almacena en un vector de la STL, los ordena, etc...
Me da un error en la compilación muy extraño:

ramon@skernak:/sms$ make
Enlazando...
g++ -O3 -o main main.cpp -g -I. -I/usr/local/fltk-1.1.4/include -I/usr/X11R6/include -L/usr/local/fltk-1.1.4/lib -L/usr/X11R6/lib sms.o -lfltk -lX11 -lXext -lsupc++
sms.o: En la función Sms':
sms.cpp:7: referencia a
Agenda::Agenda()' sin definir
sms.cpp:15: referencia a Agenda::~Agenda()' sin definir
sms.cpp:7: referencia a
Agenda::Agenda()' sin definir
sms.cpp:15: referencia a Agenda::~Agenda()' sin definir
sms.o: En la función
Sms':
./sms.h:23: referencia a Agenda::~Agenda()' sin definir
./sms.h:23: referencia a
Agenda::Agenda()' sin definir
collect2: ld devolvió el estado de salida 1
make: *** [main] Error 1

No entiendo a que se debe error, cuando los constructores y destructores de la clase están definidos.
¿Alguien sabe porque ocurre esto?

maRc

¿Has puesto todos los includes correspondientes?

DArgo

Solucionado el error... xD
Era porque me habia dejado un simbolo > en el include y salian esos errores menos el que tocaba. Gracias!

Usuarios habituales

  • DArgo
  • maRc
  • r2d2rigo
  • snoozed21
  • Pr0xNT4