C/Visual C - Va por Punteros y declaraciones

 
Vista:

Va por Punteros y declaraciones

Publicado por Nelek (816 intervenciones) el 03/03/2006 12:07:20
Hola a todos,

la situación es: Programo en VC++ y hasta el momento no me habia dado cuenta, pero resulta que he encontrado casos que no se por donde tomarlos.

Por ejemplo:
CButton* p_Button1 = (CButton*) GetDlgItem (IDC_BUTTON_1) <<- Esto declara un puntero de la clase CButton y se lo asigna al elemento en pantalla IDC_BUTTON_1 para poder usar las funciones heredadas desde CButton. Hasta aquí mas o menos claro, pero...

CWnd *p_Button2 = GetDlgItem (IDC_BUTTON_2) <-- Esto teoricamente hace lo mismo que arriba pero con el num2.

El programa es un ejemplo que encontre por la red y funciona.

Mi preguntas son:

Que diferencia hay en poner el * del puntero pegado a la clase (es decir: CButton* ) o pegado al objeto creado ( *p_Button2)?.

Y por que en la segunda declaración no hace falta poner de nuevo el "(CButton*)" que hay nada más después del signo igual en la primera?

Muchas Gracias de antemano, seguramente sea una tonteria, pero ahora no caigo y creo que es algo relevante.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Va por Punteros y declaraciones

Publicado por fernando.gomez (1603 intervenciones) el 04/03/2006 04:13:24
Respuestas.

1. No hay ninguna diferencia, esto depende del estilo del programador y -eventualmente- de tus gustos. Yo acostumbro a hacerlo así: CButton* porque como que doy a entender que es p_Button2 es una variable tipo puntero a CButton. Cuestión de gustos, nomás.

2. Bueno, esto ya es cuestión del framework de MFC. Lo que pasa es lo siguiente. GetDlgItem te regresa un puntero -en este ejemplo- a un CButton, pero GetDlgItem tiene que regresar el puntero de forma genérica, de tal suerte que también pueda regresar un CEdit, CStatic, etc. Como todas estas clases heredan de CWnd, pues entonces por ello es que te regresa un puntero a CWnd. Pero en realidad es un CButton, por lo que tienes que hacer una conversión estática, static cast, para que te regrese el puntero original a CButton.

Como vestigios de C, lo haces así:

CButton* p_Button1 = (CButton*) GetDlgItem (IDC_BUTTON_1);

mientras que lo correcto en C++ sería

CButton* p_Button1 = static_cast<CButton*>(GetDlgItem (IDC_BUTTON_1));

En el caso 2) evidentemente no necesitas hacer un static cast puesto que no te interesa reconvertirlo a CButton. Esto es consecuencia directa del paradigma de orientación a objetos y en particular, herencia y polimorfismo.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Va por Punteros y declaraciones

Publicado por Nelek (816 intervenciones) el 06/03/2006 08:23:08
Gracias, sobre todo por la correccion en la forma de la declaracion en el primer ejemplo. Ni me habia dado cuenta :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar