Tengo un problemas con clases y Dev-C++

Consulte acerca de programas, técnicas, algoritmos etc.

Tengo un problemas con clases y Dev-C++

Notapor LhaN » Mar Ene 15, 2008 12:08 am

Estoy con pequeño problema, resulta que a cada clase el Dev-C++ no me las reconoce, ni las mías, ni las estándar.
Por ejemplo:
Código: Seleccionar todo
...//Codigo sin importancia
#include <list>

#include "game.cpp"

class clssGame;//Esto lo tuve que agregar para que clssGame *game no me de el error

class clssActorManager
{
   protected:
      clssGame *game;//aca daba el error
      list <clssActor*> actores;//aca da el error!
... //continua el codigo
}


En dicha línea me tira el error
25 D:\Mis documentos\Proyectos C++\Libreria para Juegos\actormanager.cpp ISO C++ forbids declaration of `list' with no type
25 D:\Mis documentos\Proyectos C++\Libreria para Juegos\actormanager.cpp expected `;' before '<' token


Cual es el problema?

Gracias desde ya. Saludos.
LhaN
 
Mensajes: 8
Registrado: Sab Ene 12, 2008 10:58 pm

Notapor Geo » Mar Ene 15, 2008 6:28 am

Te estás enfrentando al manejo de espacios de nombre (namespaces) del C++ estándar :P.

En donde tienes esto:
Código: Seleccionar todo
#include <list>

Pon esto:
Código: Seleccionar todo
#include <list>
using std::list;

o esto:
Código: Seleccionar todo
#include <list>
using namespace std;

La segunda forma es más fácil para cuando incluyes varias librerías estándar. La primera es explícita y la tendrías que poner por cada elemento de la librería estándar que quieras usar, por ejemplo:
Código: Seleccionar todo
#include <iostream>
using std:cin;
using std:cout;
using std:endl;

//...
cout << "Hola :)" << endl;

// O así:
#include <iostream>
using namespace std;

// ...
cout << "Hola :)" << endl;


Si no lo haces así, tendrías que escribir std::list en todas las partes de tu código donde necesites declarar una variable de este tipo, algo así:
Código: Seleccionar todo
#include <iostream>

//...
std::cout << "Hola :)" << std::endl;


Suerte.
La imaginación es el límite.
Visita mi blog en inglés o en español.
Geo
 
Mensajes: 244
Registrado: Jue Ago 10, 2006 3:51 am
Ubicación: México

Notapor LhaN » Mar Ene 15, 2008 4:53 pm

Del detalle del
Código: Seleccionar todo
using namespace std;
ya me había dado cuenta, pero el problema con mis clases persiste... creía que se había solucionado al agregar lo que agregue... pero en vez de estarme declarando la clase me la redefine y luego ya no sirve lo demás...
Error 1
29 D:\Mis Documentos\Proyectos C++\Libreria para Juegos Dev\stagemanager.cpp ISO C++ forbids declaration of `clssGame' with no type
29 D:\Mis Documentos\Proyectos C++\Libreria para Juegos Dev\stagemanager.cpp expected `;' before '*' token

el VC 6.0 con sp6 me tira el error
d:\mis documentos\proyectos c++\libreria para juegos vc++\stagemanager.cpp(29) : error C2143: syntax error : missing ';' before '*'
que es el mismo que me tira el Dev-C++ supongo.
Ese error es para el siguiente código:
Código: Seleccionar todo
#include "SDL/SDL.h"

#include "game.cpp"
#include "actor.cpp"

class clssStageManager
{
   private:
      void limpiarPantalla();
   
   protected:
      clssGame *game;//ERROR


Error 2 (Cuando le digo que clssGame es una clase, esto lo hice por que lo leí en algun lado que alguen había solucionado el error, pero a mi no me ha servido)

68 D:\Mis Documentos\Proyectos C++\Libreria para Juegos Dev\stagemanager.cpp 'class clssGame' has no member named 'actorManager'

Claro que actorManager no es un miembro de la clase, eso que agregue me la esta redefiniendo.
Acá está lo que le agrege:
Código: Seleccionar todo
class clssGame{};//AGREGADO

class clssStageManager
{
   private:
      void limpiarPantalla();
   
   protected:
      clssGame *game;
      SDL_Surface *buffer;
      int   ancho,
         alto;

   public:
      inline clssStageManager(clssGame *g, int ancho, int alto, int bpp, int porHardware);
      ~clssStageManager() { SDL_FreeSurface(buffer); }
      SDL_Surface *obtenerBuffer() { return buffer; }
      void actualizar() { dibujar(); }
      void dibujar();
};

clssStageManager::clssStageManager(clssGame *g, int ancho, int alto, int bpp, int porHardware)
{
   game = g;
   if(porHardware)
      buffer = SDL_SetVideoMode (ancho, alto, bpp, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_NOFRAME); //Por Hardware
   else
      buffer = SDL_SetVideoMode (ancho, alto, bpp, SDL_SWSURFACE | SDL_NOFRAME); //Por Software
}

void clssStageManager::limpiarPantalla()
{
   SDL_Rect area;
   area.x = 0;
   area.y = 0;

   area.w = buffer->w;
   area.h = buffer->h;

   SDL_FillRect (buffer, &area, SDL_MapRGB (buffer->format, 0, 0, 0));
}

void clssStageManager::dibujar()
{
   clssActor *actorTemporal;
   game->actorManager->revobinar();//ERROR

Lo segundo es lo que yo creía que había solucionado... pero el error 1 es el importante... no me esta reconociendo la clase clssGame. Pero por si las dudas acá está el código del game.cpp:
Código: Seleccionar todo
#include <string>

#include "SDL/SDL.h"

#include "stagemanager.cpp"
#include "actormanager.cpp"
#include "actor.cpp"

class clssGame
{
   private:
      void empezar();
      void finalizar();
      void crearActorManager(){ actorManager = new clssActorManager(this); }
      void crearStageManager(){ stageManager = new clssStageManager(this, 640, 480, 24); }
      
   protected:
      void actualizar();
   
   public:
      string nombre;
      
      clssActorManager *actorManager;
      clssStageManager *stageManager;
      
      clssGame() { actorManager = NULL; stageManager = NULL; }
      ~clssGame();
      
      void iniciar();
      int main(int argc, char *argv[]);
};

int clssGame::iniciar()//Lo ideal seria que tomara los valores desde un archivo .ini
{
   //Inicia los subsistemas
   if (SDL_Init(SDL_INIT_VIDEO) < 0)
      return 0;
   atexit(SDL_Quit);
   
   crearActorManager();
   crearStageManager();
   
   empezar();
   return 1;
}

void clssGame::empezar()
{
   main();
   finalizar();
}

void clssGame::finalizar()
{
   delete actorManager;
   delete stageManager;
}

void clssGame::actualizar()
{
   actorManager->actualizar();
   stageManager->actualizar();
}


No se que es lo que esta mal :cry:. A ver si me pueden ayudar. Gracias desde ya.
LhaN
 
Mensajes: 8
Registrado: Sab Ene 12, 2008 10:58 pm

Notapor LhaN » Mié Ene 16, 2008 1:51 am

Bueno... he avanzado un montón, mi problema era que estaba usando solo cpp, repartí todo en .h y .cpp y se solucionó el problema, pero me ha saltado otro error.
Código: Seleccionar todo
[Linker error] undefined reference to `clssActorManager::agregar(clssActor*)'

me tira ese error para varios métodos de distintas clases, en 2 constructores y en un destructor.
Disculpen si estoy siendo molesto, pero es que he decidido dejar el .NET y ponerme con c++ puro y duro. Y de paso cañaso, usar un IDE libre y no el de guindou. Gracias desde ya. Saludos.
LhaN
 
Mensajes: 8
Registrado: Sab Ene 12, 2008 10:58 pm

Notapor kittie4man » Jue Ene 17, 2008 6:07 pm

ese mismo problema tengo yo, es por un tema de linkeo entre las clases, fijate como lo estas compilando y si estas agregando bien los .h, etc.

Estaria bueno que alguien que sepa mas pudiera dar una referencia de includes y clases en un proyecto.

Salu2
kittie4man
 
Mensajes: 10
Registrado: Vie Dic 28, 2007 7:23 pm
Ubicación: Uuuuuuuuuuuuuuuuunoooooo!!

Notapor LhaN » Vie Ene 18, 2008 4:03 am

Ya lo solucione... es que soy un tarado, en el .h yo ponia
Código: Seleccionar todo
class clssClase
{
    ...
    public:
    ...
        inline void actualizar();
    ....
}

y en el .cpp o...
1.- NO DEFINIA EL actualizar... lo hacia en una clase derivada pero no en la clase base...

2.- ponia solamente void actualizar sin el "inline"

Para mi primer error... ya que la clase base no hace nada en el actualizar hay que... o hacerla virtual pura osea...
Código: Seleccionar todo
virtual void actualizar()=0;


o definirla en el cpp así:

Código: Seleccionar todo
inline clssClase::actualizar(){};


Fijate si tu problema no es uno de estos. Saludos. Suerte.
LhaN
 
Mensajes: 8
Registrado: Sab Ene 12, 2008 10:58 pm


Volver a General

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron