Pregunta de C++

Todo aquello que no está relacionado con Gemix Studio ni con la programación DIV en general.

Pregunta de C++

Postby erkosone » Wed Dec 05, 2018 1:06 pm

Hola gente, tengo una duda muy basica pero que no logro solventar, haber si alguien de por aquí es capaz de indicarme que estoy haciendo mal..


Tengo dos archivos .CPP, estos son:
gameLibZero.cpp
game.cpp

En el primero esta escrita una clase llamada sprite.
en el segundo archivo extiendo la clase sprite y la llamo cosa..

El problema es muy basico, el constructor de 'sprite' lo único que hace es añadir esa instancia de clase a un vector de objetos, osea, añade el sprite a la lista de sprites, esto lo hace bien.

Pero el tema es que sprite tiene un metodo llamado "void frame(){}", cosa que es heredada de sprite tiene también su metodo 'frame', lo que quiero es ejecutar el frame de "cosa" en vez del frame de "sprite" que es el generico.

Pego el codigo:

Source Code (C++) [ Download ] [ Hide ]
  • /*******************************************************************************************
  • *
  • *   gameLibZero 0.1 by: Luis Lopez Martinez.        28/11/2018
  • *
  • ********************************************************************************************/
  • #include "raylib.h"
  • #include <vector>
  • #include <algorithm>
  • #include <stdio.h>
  •  
  • using namespace std;
  •  
  • class sprite;
  • vector<sprite>sprites;
  •  
  •  
  • void setup();
  • void draw();
  •  
  •  
  •  
  • //------------------------------------------------------------------------------------------------------
  • class sprite{
  •     public:
  •         bool visible = false;
  •         Texture2D graph;
  •         float x = 0;
  •         float y = 0;
  •         float z = 0;
  •         float size = 100;
  •         float angle = 0;
  •         float alpha = 255;
  •        
  •         sprite(){
  •             sprites.push_back(*this);
  •         }
  •         virtual void frame(){
  •             //j++;
  •         }
  •         void render(){
  •             if(visible){
  •                 screenDrawGraphic(graph, x, y, angle, size, alpha);
  •             }
  •         }
  • };
  • //------------------------------------------------------------------------------------------------------
  • int main()
  • {
  •     // Initialization
  •     setup();
  •  
  •     // Main game loop
  •     while (!WindowShouldClose())    // Detect window close button or ESC key
  •     {
  •         // Update
  •         //----------------------------------------------------------------------------------
  •         // TODO: Update your variables here
  •         for(auto s : sprites){      // draw game sprites..
  •             s.frame();
  •         }
  •         //----------------------------------------------------------------------------------
  •         // Draw
  •         //----------------------------------------------------------------------------------
  •         BeginDrawing();
  •             ClearBackground(RAYWHITE);
  •             draw();                     // main game code call..
  •             for(auto s : sprites){      // draw game sprites..
  •                 s.render();
  •             }
  •         EndDrawing();
  •         //----------------------------------------------------------------------------------
  •     }
  •  
  •     // De-Initialization
  •     //--------------------------------------------------------------------------------------  
  •     CloseWindow();        // Close window and OpenGL context
  •     //--------------------------------------------------------------------------------------
  •  
  •     return 0;
  • }


Source Code (C++) [ Download ] [ Hide ]
  • /* gameLibZero game.cpp template */
  • int j = 0;
  • #include "gameLibZero.cpp"
  •  
  • // Global var block..
  • Texture2D img;
  • int st = 0;
  • //--------------------------------------------------------------------------------------
  • void setup(){
  •     setMode(1280, 720);
  •     //ToggleFullscreen();
  •     setTitle("gameLibZero 0.1 pre alpha!!!!");
  •     setFps(60);
  •     img = loadImage("data/images/00.png");
  •    
  • }
  • //--------------------------------------------------------------------------------------
  • class cosa : public sprite{
  •     public:
  •     void frame(){
  •         j++;
  •     }
  • };
  •  
  • //--------------------------------------------------------------------------------------
  • void draw(){
  •    
  •     switch(st){
  •         case 0:
  •             cosa* c = new cosa();
  •  
  •             st = 10;
  •             break;
  •     }
  • }
  • //--------------------------------------------------------------------------------------
  • //--------------------------------------------------------------------------------------
  •  
  •  
  •  
  •  
  •  


Veis como 'cosa' tiene su metodo "frame()", y es este el que quiero ejecutar desde este trozo de codigo del primer archivo:

Source Code (C++) [ Download ] [ Hide ]
  • // Update
  •         //----------------------------------------------------------------------------------
  •         // TODO: Update your variables here
  •         for(auto s : sprites){      // draw game sprites..
  •             s.frame();
  •         }


Creo que estoy añadiendo al vector de objetos la instance de 'sprite' y no la de 'cosa', puede ser ese el problema?
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Re: Pregunta de C++

Postby erkosone » Thu Dec 06, 2018 10:03 am

Solucionado!
Vaya tela, habia escuchado alguna vez que la OOP de C++ daba bastante asco.. y bueno.. para alguien que empieza se confirma, es muy exigente en cuanto a semantica y logica.. demasiado complejo para empezar...

Al final mi problema era que tenia que declarar metodos abstractos con virtual para luego implementarlos en los objetos de clases derivadas de la clase principal abstracta, y a todo esto teniendo en cuenta las mil y una cosas como crear vectores de objetos abstractos no se puede.. solo vectores de "punteros" a objetos abstractos..

Madre mia.. si si C++ sera muy rapido, pero como lenguaje es bastante mas complicado que java, la verdad es que java en comparación es como super facil.
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Re: Pregunta de C++

Postby erkosone » Thu Dec 06, 2018 10:06 am

Por si a alguien le interesa el tema, de aquí la solución: https://elvex.ugr.es/decsai/builder/int ... _VIRTUALES
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Re: Pregunta de C++

Postby CicTec » Thu Dec 06, 2018 1:03 pm

Hola erkosone,

No es necesario usar templates o metodos virtuales, con features muy avanzadas que se usan cuando se necesita crear algo muy generico, en tu caso era suficiente crear clases simples especificas y seria casi identico a Java, pero bueno, ya lo tienes asi.
User avatar
CicTec
 
Posts: 16553
Joined: Thu Jul 31, 2008 10:18 pm

Re: Pregunta de C++

Postby erkosone » Thu Dec 06, 2018 1:10 pm

Me miré una clase polimorfismo y fue la solución comun que todos recomendaban, por eso la he hecho así. :)
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Re: Pregunta de C++

Postby CicTec » Thu Dec 06, 2018 1:21 pm

Si si pero es un concepto muy avanzado y de uso generico que Java no soporta y es bastante mas complicado, hubieras podido tambien solucionarlo con una clase mas especifica programada sin templates, etc... similar a Java, digamos que has optado para la solucion mas complicada para haber empezado hace poco con C++.
User avatar
CicTec
 
Posts: 16553
Joined: Thu Jul 31, 2008 10:18 pm

Re: Pregunta de C++

Postby erkosone » Thu Dec 06, 2018 1:24 pm

Si tio.. la verdad es que me ha costado entenderlo bien 2 dias jeje.. y no me acordaba ni de escribir "using namespaces std" jajajaja.. imaginate.. por suerte una vez sabes lo que quieres hacer, hacerlo en otro lenguaje es mas sencillo que empezar completamente de cero..

Ahun así.. C++ a estos niveles tiene tela marinera.. ya el primer dia con punteros a objetos, con vectores de clases abstractas.. en C++ parece que todo esto es mas difícil hecho a propósito :P
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.


Return to Offtopic

Who is online

Users browsing this forum: No registered users and 19 guests