C/Visual C - Que quiere decir esto?

 
Vista:

Que quiere decir esto?

Publicado por Nelek (816 intervenciones) el 27/07/2006 10:34:59
class CModalShapePropSheet;

class CShapePreviewWnd : public CWnd
{
friend class CModalShapePropSheet;

CShapePreviewWnd();

//{{AFX_MSG(CShapePreviewWnd)
afx_msg void OnPaint();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

Esto me lo he encontrado en un ejemplo del MSDN. Lo que yo entiendo es...

Esta clase CShapePreviewWnd esta derivada de CWnd publicamente, hace el friend a la otra clase (que en el programa ejecutable, esta clase es contenida por la otra) para que pueda acceder a sus variables miembro y metodos protegidos y demás, que si el friend no podria hacerlo. El constructor, el mapa de mensajes esta claro.

Pero pq pone arriba la otra class? es para poder hacer el friend, no? Es decir, si no fuera necesario acceder a los metodos privados... seria como hacer un #include?

O me estoy haciendo la picha un lio? Alguien me lo explica?
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:Que quiere decir esto?

Publicado por x (63 intervenciones) el 27/07/2006 16:07:28
hasta donde yo tengo entendido, eso es un prototipo de clase, utilizado para 'avisar' a las funciones, clases, en si, a todo lo que le sigue, de que esa clase existe, por que si CShapePreviewWnd esta declarada antes que CModalShapePropSheet, entonces no podra tener CShapePreviewWnd como friend a CModalShapePropSheet, por que esta al momento no existe... pero mejor esperamos a fernando =P
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:Que quiere decir esto?

Publicado por fernando.gomez (1603 intervenciones) el 27/07/2006 17:30:33
Exacto. Imaginemos el siguiente ejemplo:

class A {
public: B m_b;
};

class B {
public: A* m_pA;
};

Este tipo de relaicones se da frecuentemente, donde una clase agrega a otra, pero la segunda necesita saber algo de la primera, digamos, a través de un puntero. Da igual si incluyes primero la declaración de B sobre A, tendrías el mismo problema.

Así las cosas, pones un proto-prototipo de clase para decirle al compilador que no se me angustie, que va a tener la clase B disponible.

class B;

class A { ... };

class B { ... };

A veces es costumbre también poner todas las clases que se van a declarar en un encabezado, al principio del mismo:

class A;
class B;

class A { ... };

class B { ... };

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:Que quiere decir esto?

Publicado por x (63 intervenciones) el 27/07/2006 18:04:59
tks... eso hago yo, al igual que con las funciones... es que hace muncho lei esta estructura: includes, globales, prototipos, main, implementacion de prototipos, ignoro si este bien...
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:Que quiere decir esto?

Publicado por Nelek (816 intervenciones) el 28/07/2006 09:37:24
Gracias :)
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