Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





como se soluciona este error??

Iniciado por Zeigon, 22 de Enero de 2003, 08:31:17 PM

« anterior - próximo »

Zeigon

                                he creado una clase con varios métodos para facilitar el arduo trabajo de crear un simple ventana. el constructor copia recibe la clase por ref. y la inicializa y registra, otro método hace lo de CreateWindow, pásandole todas las variabes q necesita, y el 3º muestra la ventana simplemente. tengo la clase en un header q me he creado y va todo bien, (todos los errores leves ya corregidos :P) pero al llegar al método de createwindow, me da este error al compilar: (he quitado las rutas de los archivos para no abultar)



error C2039: 'crear_ventana' : is not a member of 'tagWNDCLASSA'

       c:archivos de programamicrosoft visual studiovc98includewinuser.h(1184) : see declaration of 'tagWNDCLASSA'

Error executing cl.exe.



es lo único q me falla, pero es q ni mirando el archivo este y la estructura q viene, sé como solucionarlo.  :enfadado:  :enfadado:


venga gracias                                
eigon
----------------------------------------------
El arca de Noe fue construida por amateurs.
El Titanic por profesionales.

HgH

                                Pastea el código fuente completo o pon un link a el, si no, me parece que poco podemos (puedo  :oops: ) hacer.
De todas maneras... he creido que tienes definida e implementada la clase en un archivo de cabecera (¿Es así?). No es una buena idea hacer implementaciones de clase en un .h :enfadado:

Por otra parte, suena como si la declaración de la clase no coincidiera con la implementación. Repasa bién el código fuente.   :ojo:                                
gH _ TLOTB
..................
"No queremos estar obligados, por nada ni nadie, a pensar sólo en lo que es más comercial. Siempre seremos, antes que nada, programadores"

- Equipo de Zigurat -

Zeigon

                                aqui pongo la web al codigo, el enlace esta nada más entrar. no es directo pq lycos no deja enlaces directos  :enfadado:
http://usuarios.lycos.es/theprofessional/
no es muy largo ni el .cpp ni el .h con la clase

como q no es bueno poner clases, yo creo haberlo visto en algunos sitios. pq no es bueno? entonces donde debería ponerlas, en un .cpp normal enlazado??

venga gracias                                
eigon
----------------------------------------------
El arca de Noe fue construida por amateurs.
El Titanic por profesionales.

synchrnzr

                                Hombre, no he mirado nada porque tampoco tengo mucho tiempo, pero el error parece que sea que intentas llamar a un método crear_ventana() que no existe en la clase tagWNDCLASSA ^_^'

sync                                

Zeigon

                                la estructura 'tagWNDCLASSA' es del compilador, me refiero q yo no la he hecho, y por supuesto mi método no viene en ella. me la miré pero no sé en q puede afectar a mi programa  :llorando:

thx                                
eigon
----------------------------------------------
El arca de Noe fue construida por amateurs.
El Titanic por profesionales.

fiero

                                Imagino que lo que quieres hacer es esto:


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hprevinstance, LPSTR lpCmdLine, int nShowCmd)

{

WNDCLASS clasewnd;

ventana ventana1(clasewnd, "clase1", hInstance); //Se inicializa y registra la clase

clasewnd.lpfnWndProc = WindowProcedure;

HWND hWnd;

MSG msg;



ventana1.crear_ventana(hWnd, "Ventanita preDirectX9", 640, 480, hInstance);



while(GetMessage(&msg, 0, 0, 0) == TRUE)

{

 TranslateMessage(&msg);

 DispatchMessage(&msg);

}

return msg.wParam;

}



Tu habias puesto:

clasewnd.crear_ventana(hWnd, "Ventanita preDirectX9", 640, 480, hInstance);

De todas formas siguen saliendo errores, como un destructor sin implementar, etc...
Yo no te puedo ayudar ahora mismo, ya que siempre utilizo las MFC y en estas cosillas estoy oxidado...

un saludo                                
www.videopanoramas.com Videopanoramas 3D player

HgH

                                Fiero tiene razón.



WNDCLASS clasewnd;

...

hWnd = clasewnd.crear_ventana(hWnd, "Ventanita preDirectX9", 640, 480);


No es correcto.  Cambia clasewnd por ventana1, tal y como te ha dicho Fiero.

Fallos que he visto:

:!: 1.- crear_ventana no devuelve nada, así que la linea


hWnd = ventana1.crear_ventana(hWnd, "Ventanita preDirectX9", 640, 480);


No tiene sentido.

:!: 2.- En la declaración de la clase, el método crear_ventana tiene la siguiente declaración


crear_ventana(HWND &hwnd, char * title, int ancho, int alto, HINSTANCE hInstance);


Mientras que en main.cpp lo llamas sin pasarle hInstance.

:!: 3.- No tienes el destructor implementado y si declarado

:!: 4.- Vale que el contructor no tenga tipo, pero los demás métodos como mínimo tendrías que declararlos como void

Pero en definitiva, son fallos leves ;-)

En cuanto al tema de dejar la implementación de las clases en archivos de cabecera, para mi es un tema de limpieza (Cada cosa a su sitio: codigo a los .cpp y declaraciones a los .h :D), a parte de que, una vez compilado el cpp con las clases que ya están bién, ya no se vuelve a compilar, con la consiguiente reducción del tiempo de compilación 8). Si la clase está en un fichero de cabecera, se tiene que compilar cada vez que modifiques algo, ya no de la clase, sino del fichero donde tengas incluido el .h (si no tienes un compilador incremental :loco: ).

Ale, a corregir...
Saludotes                                
gH _ TLOTB
..................
"No queremos estar obligados, por nada ni nadie, a pensar sólo en lo que es más comercial. Siempre seremos, antes que nada, programadores"

- Equipo de Zigurat -

Zeigon

                                vale gracias a los dos, era el pequeño detalle ese, joe pq tonteria.

bueno el caso es q compilo y no da errores pero claro no podia ser todo tan bonito asi q me pone unhandled exception y se me pira al debugger y en ASM encima, asi q ni idea.

estaba poniendo lo q me decia HgH de el codigo al cpp y declaraciones al .h y bueno, he puesto lo q es la definición de la clase y todo el mazacote en otro cpp q no es el principal, pero no sé como enlazarlo pq no me lo coge.
le puse en el .h: #include "ZNwin2.cpp" pero no lo pilla, como se incluyen los cpp? no poniendo nada de enlazar el cpp, tampoco va

como lo hago?, gracias                                
eigon
----------------------------------------------
El arca de Noe fue construida por amateurs.
El Titanic por profesionales.

Mars Attacks

                                No incluyas los .cpp, sólo los .h de esos .cpp (creo, no me hagas mucho caso que acabo de cenar lentejas).                                

HgH

                                Como dice Mars Attacks (a pesar de haberse fartado a lentejas como un gorrinillo sudoroso©), son los .h los que se deben incluir en los .cpp

En el .h:


// MiClase.h

#pragma once

class MiClase

{

    public:

          MiClase();

          ~MiClase();

          //definiciones de miembros y métodos públicos

    private:

          //definiciones de miembros y métodos privados          



};

//Fin de MiClase.h



y en el cpp


//MiClase.cpp

#include "MiClase.h"

MiClase::MiClase()

{

}

MiClase::~MiClase()

{

}

...

//coding,coding,coding

//Fin de MiClase.cpp



Teniendo estos dos ficheros incluidos en el proyecto (te estoy hablando de Visual C. En otros entornos, no debe de diferir demasiado), puedes usar la clase en cualquiera de los otros .cpp que tengas incluidos en el proyecto, siempre que incluyas en ellos el .h



#include "MiClase.h"



void HazAlgo()

{

  MiClase InstanciaDeMiClase;



  .....

}





Realmente los compiladores de C te dejan hacer muchas guarrerías (como incluir en un cpp otro cpp y esas cosas), pero yo pienso que es mejor estructurarlos un poco y no enguarrar mucho el código, sino después no hay quien lea el código).
Bueno, espero que te haya aclarado algo...
Cuentanos que tal :)
Saludotes                                
gH _ TLOTB
..................
"No queremos estar obligados, por nada ni nadie, a pensar sólo en lo que es más comercial. Siempre seremos, antes que nada, programadores"

- Equipo de Zigurat -

Zeigon

                                reholas, he arreglado el codigo con todo lo q me habeis dicho, y ya está en sus respectivos archivos cada cosa; el problema ahora  :enfadado:  es q me da error al ejecutarse; exception unhandled.

repongo la web con el código. plz es lo ultimo q me falla y esto ya si q he probado de todo y no se q puede pasar:

http://usuarios.lycos.es/theprofessional/

gracias x 5     :D                                
eigon
----------------------------------------------
El arca de Noe fue construida por amateurs.
El Titanic por profesionales.

synchrnzr

                                Por supuesto que te da Access Violation, tu WndClass.lpfnWndProc no está inicializado :o

Sólo con que descomentes la línea WndClass.lpfnWndProc = WindowProcedure ya no se te colgara. No te ilusiones, te advierto que tampoco se te verá la ventana... cuidadín no vayas a crear un montón de procesos  :ojo:

Por otro lado, como ya se ha dicho, cuando te acostumbras a las MFCs no son tan malas, creo que estás currando inútilmente :I

sync                                

Zeigon

                                lo de q no se muestra la ventana ya lo sabía; es pq falta poner el método mostrar_ventana. ya me funciona y ya se me ve la ventanita. gracias a todos, q aunq una ventanita chorra, al menos me sale lo q quería.
por cierto alguien me decía q faltaba definir el destructor de la clase; pero q hay q poner dentro? yo es q he visto q con poner el destructor declarado, ya vale, se destruye y todo eso, vamos q no lleva más código q:  ~miclase() {} ;

si no es así, decidme q hay q poner, q a lo mejor estoy cagandola en lo q haga.

volviendo a la ventanita, q luego no vale para nada, pues  :(   pero al menos he conseguido q rule.
por cierto, pq dices q no vale para nada? y ya de paso, me podeis explicar q es lo de las MFC?? pq lo vi en la ayuda del VC++6 pero vamos q me quede con q eran un conjunto de librerias, pero nada más. así q sigo aquí algo ignorante  :-?                                
eigon
----------------------------------------------
El arca de Noe fue construida por amateurs.
El Titanic por profesionales.

synchrnzr

                                En el destructor deberías liberar toda la memoria asignada dinámicamente, aunque ahora no me acuerdo creo que no tenías nada dinámico. Por otro lado, si no declaras el destructor o lo declaras sin contenido, el C++ te crea un destructor por defecto que básicamente libera la memoria reservada para el objeto.

Las MFCs son un conjunto de clases proporcionadas por Microsoft para trabajar con ventanas. Junto con las MFCs y el ClassWizard del VC++ puedes currarte unos diálogos y formularios igual que como lo harías más o menos en Visual Basic o en Borland Builder, sólo que es un poco más complicado. Pero por lo menos te permite dibujar la ventanita y te genera el solito gran parte del código que necesitas para gestionar los componentes, y así te ahorras de hacer eso que estás haciendo. Si vas a dedicarte a hacer aplicaciones de ventanas con VC++ deberías conocer las MFCs. Para un videojuego, que en general no necesita ventanas, no te hace tanta falta.

Y lo que has hecho, inútil tampoco es hombre, por lo menos has conseguido que funcione, eso siempre recompensa :D

sync                                

Zeigon

                                vale, claro lo del destructor. si me imaginaba q era para liberar la memoria dinámica, pero no tengo nada asi, asi q nada. otra cosa a tachar de la lista de dudas. thx

ah, asi q lo de las MFC es lo de q vas y te creas a golpe de raton las ventanitas. vamos lo de la barra esa de objetos, q te deja crear un boton, un dialogo , etc. q solo tienes luego q poner los comandos q recibe la ventana en el código. eso si lo he visto un poco, pero era más q nada por ver q al menos me sale esto. y otra duda menos :D  thx

de todas formas como decía el titulillo de la ventana q he hecho, estoy empezando con el DX así q de aplicaciones de ventanitas poco. vamos q se ejecute en ventana en vez de pantalla completa a lo mejor, pero vamos q se me entiende  :P                                
eigon
----------------------------------------------
El arca de Noe fue construida por amateurs.
El Titanic por profesionales.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.