C/Visual C - visual_c_uses undefined class

 
Vista:

visual_c_uses undefined class

Publicado por Daniel (9 intervenciones) el 17/05/2005 01:15:56
Primero saludar a todos los que hacieis posible este foro.
Tengo un pequeño problema en el siguiente código:

class CEditTexto;

class CEjemplo2View : public CFormView
{
protected: // create from serialization only
CEjemplo2View();
DECLARE_DYNCREATE(CEjemplo2View)

public:
//{{AFX_DATA(CEjemplo2View)
enum { IDD = IDD_EJEMPLO2_FORM };
CEditTexto m_ObjTextoNombre;
CEditTexto m_ObjTextoApellidos;
//}}AFX_DATA

¿Por qué el compilador saca el siguiente mensaje cuando yo he puesto una predeclaración de la clase CEditTexto (class CEditTexto)?:

'm_ObjTextoNombre' uses undefined class 'CEditTexto'.

Muchas gracias a todos,

Un cordial saludo,

Daniel Leyva

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:visual_c_uses undefined class

Publicado por fernando.gomez (1603 intervenciones) el 17/05/2005 01:36:48
Hola. El que pongas la declaración "class CEditTexto; " antes de la de la otra clase es sólo para indicarle al compilador que aguante vara mientras compila el CPP, y que le garantizas que antes de que comience a compilar encontrará la definición de CEditTexto. Pero esa línea NO SIGNIFICA QUE ESTES DECLARANDO UNA CLASE, SINO UN PROTOTIPO. Y hay que declarar la clase.

Por ejemplo, supongamos que CEditTexto lo guardaste en un archivo EditTexto.h, y CEjemplo2View está en Ejemplo2View.h. Entonces, en el CPP Ejemplo2View.cpp debes asegurarte de que se haga un include de EditTexto.h ANTES de Ejemplo2View.h:

// Ejemplo2View.cpp
#include "EditTexto.h"
#include "Ejemplo2View.h"

CEjemplo2View::CEjemplo2View()
{
}
// etc

Acuérdate que #include copia el contenido del .H y lo inserta en el .CPP. Por ello, debes incluir antes EditText.

Ahora bien, otra solución es que en Ejemplo2View.h incluyas la sentencia "#include EditText.h". Pero aguas con las referencias circulares; si decides emplear esta forma, te sugiero el uso de "#pragma once" como la primera línea de tus .H, para evitar referencias circulares.

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:visual_c_uses undefined class

Publicado por fernando.gomez (1603 intervenciones) el 17/05/2005 01:39:37
En particular, eso de incluir líneas como:

class CEditTexto;

sólo es útil cuando tienes varias clases declaradas en un mismo .H:

class CClase1;
class CClase2;
class CClase3;

class CClase1 {
CClase2 obj2;
CClase3 obj3;
};

class CClase2 {
CClase1 obj1;
CClase3 obj3;
};

class CClase3 {
CClase1 obj1;
CClase2 obj2;
};

Así, no se hace bolas el compilador. 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:visual_c_uses undefined class

Publicado por Daniel (9 intervenciones) el 17/05/2005 23:30:29
Primero agradecerle la atención prestada.
Me comentas el tema de que no se ha definido la clase. Pero la clase sí está definida lo que ocurre es que no te puse el código completo porque pensaba que iba a ser un poco pesado para leer:

// ejemplo2View.h : interface of the CEjemplo2View class
//
/////////////////////////////////////////////////////////////////////////////

#if !defined(AFX_EJEMPLO2VIEW_H__5B5922EF_C589_11D9_899B_444553540000__INCLUDED_)
#define AFX_EJEMPLO2VIEW_H__5B5922EF_C589_11D9_899B_444553540000__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class CEditTexto;

class CEjemplo2View : public CFormView
{
protected: // create from serialization only
CEjemplo2View();
DECLARE_DYNCREATE(CEjemplo2View)

public:
//{{AFX_DATA(CEjemplo2View)
enum { IDD = IDD_EJEMPLO2_FORM };
CEditTexto m_ObjTextoNombre;
CEditTexto m_ObjTextoApellidos;
//}}AFX_DATA

// Attributes
public:
CEjemplo2Doc* GetDocument();

// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CEjemplo2View)
public:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
virtual void OnInitialUpdate(); // called first time after construct
//}}AFX_VIRTUAL

// Implementation
public:
virtual ~CEjemplo2View();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif

protected:

// Generated message map functions
protected:
//{{AFX_MSG(CEjemplo2View)
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

#ifndef _DEBUG // debug version in ejemplo2View.cpp
inline CEjemplo2Doc* CEjemplo2View::GetDocument()
{ return (CEjemplo2Doc*)m_pDocument; }
#endif

/////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////
// CEditTexto window

class CEditTexto : public CEdit
{
// Construction
public:
CEditTexto();

// Attributes
public:

// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CEditTexto)
//}}AFX_VIRTUAL

// Implementation
public:
virtual ~CEditTexto();

// Generated message map functions
protected:
//{{AFX_MSG(CEditTexto)
afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);
//}}AFX_MSG

DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_EJEMPLO2VIEW_H__5B5922EF_C589_11D9_899B_444553540000__INCLUDED_)

No creo que sea un problema del classwizard... Lo que intento hacer con este código es la subclasificación del teclado para poder capturar la tecla "ENTER".

Muchas gracias.

Un cordial saludo,

Daniel Leyva
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:visual_c_uses undefined class

Publicado por fernando.gomez (1603 intervenciones) el 18/05/2005 00:41:08
Daniel,

el hecho de que escribas la clase y la tengas en un archivo NO QUIERE DECIR que al momento de que la requieras (en CFormView en tu caso) que esté definida. Por ello hice incapié en la parte de los #includes que mencioné, que te pediría releyeras. Si el include de FormView está una línea antes del include de EditTexto, entonces para FormView no va a estar definida. Por ello, tienes que asegurarte que suceda a la inversa, es decir, primero hacer el include de EditTexto y después el de FormView. Por cierto, ¿si recuerdas cómo funciona el preprocesador y los #includes?
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