elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Se ejecuta el método virtual de la clase base y no la heradada
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Se ejecuta el método virtual de la clase base y no la heradada  (Leído 1,550 veces)
CSQCasimiro

Desconectado Desconectado

Mensajes: 20



Ver Perfil
Se ejecuta el método virtual de la clase base y no la heradada
« en: 22 Octubre 2014, 02:10 am »

SOLUCIONADO. fui muy boludo y en el main no usaba la clase heredada JAJAJAJ. el cafe no basto para esa noche
Hola, como andan ? espero que bien :p

Verán, después de mucho regreso con C/C++ extrañando sus punteros jaja
Tengo este problema que ya me quemo las pestañas y no veo lo que esta mal.

Tengo mi clase base Escenario.h con su método virtual isEndEscena el cual luego reescribo en su clase derivada HelloEscena y por ultimo, almaceno HelloEscena en un vector de vector<CEscenario*> de la clase Cordinador

El problema esta, en que cuando, tengo llamar a isEndEscena, me llama a la de la clase base y no su deribada.

Dejo el código:

Escenario
Código
  1. //head
  2. #pragma once
  3.  
  4. #include <SFML\Graphics.hpp>
  5. #include "Sprite.h"
  6.  
  7. class CEscenario
  8. {
  9. public:
  10. void addSprite(CSprite*);
  11. void clearSprites();
  12. void deleteSprite(const char* key);
  13.  
  14. virtual bool isEndEscena(sf::Event);
  15.  
  16. void updateSprites(sf::Event);
  17. void drawSprites();
  18.  
  19. char* getKey();
  20. private:
  21. std::vector<CSprite*> sprites;
  22. char* key;
  23. };
  24.  
  25. //cpp
  26.  
  27. #include "Escenario.h"
  28.  
  29. bool CEscenario::isEndEscena(sf::Event)
  30. {
  31. return true;
  32. }
  33.  
  34. char* CEscenario::getKey()
  35. {
  36. return this->key;
  37. }
  38.  
  39. void CEscenario::updateSprites(sf::Event evento)
  40. {
  41. int i = 0;
  42. for (int i = 0; i < int(this->sprites.size()); i++)
  43. {
  44. this->sprites[i]->update(evento);
  45. }
  46. }
  47.  
  48. void CEscenario::addSprite(CSprite* newSprite)
  49. {
  50. this->sprites.push_back(newSprite);
  51. }
  52.  
  53. void CEscenario::deleteSprite(const char* key)
  54. {
  55. int i = 0;
  56. for (int i = 0; i < int(this->sprites.size()); i++)
  57. {
  58. if (std::strcmp(this->sprites[i]->getKey(), key) == 0)
  59. {
  60. this->sprites.erase(this->sprites.begin() + i);
  61. return;
  62. }
  63. }
  64. }
  65.  
  66. void CEscenario::clearSprites()
  67. {
  68. this->sprites.clear();
  69. }
  70.  
  71. void CEscenario::drawSprites()
  72. {
  73. int i = 0;
  74. for (int i = 0; i < int(this->sprites.size()); i++)
  75. {
  76. this->sprites[i]->draw();
  77. }
  78. }
  79.  

HelloEscena
Código
  1. //head
  2. #pragma once
  3.  
  4. #include <SFML\Graphics.hpp>
  5. #include "Escenario.h"
  6.  
  7. class CHelloEscena : CEscenario
  8. {
  9. public:
  10. bool isEndEscena(sf::Event);
  11. };
  12.  
  13.  
  14. //cpp
  15. #include "HelloEscena.h"
  16.  
  17. bool CHelloEscena::isEndEscena(sf::Event evento)
  18. {
  19. int a = 0;
  20. return false;
  21. }
  22.  

Cordinador
Código
  1.  
  2. //head
  3. #pragma once
  4.  
  5. #include <vector>
  6. #include "Escenario.h"
  7.  
  8. class CCordinador
  9. {
  10. public:
  11. void addEscenario(CEscenario*);
  12. void clearEscenarios();
  13. void deleteEscenario(const char *key);
  14.  
  15. CEscenario* getEscenario();
  16.  
  17. //void nextEscenario();
  18. void(*nextEscenario)();
  19. private:
  20. std::vector<CEscenario* > escenarios;
  21. CEscenario *escenarioActual;
  22. };
  23.  
  24. //cpp
  25. #include <cstring>
  26.  
  27. #include "Cordinador.h"
  28.  
  29. CEscenario* CCordinador::getEscenario()
  30. {
  31. return escenarioActual;
  32. }
  33.  
  34. void CCordinador::addEscenario(CEscenario* newEscenario)
  35. {
  36. this->escenarios.push_back(newEscenario);
  37. this->escenarioActual = newEscenario;
  38. }
  39.  
  40. void CCordinador::deleteEscenario(const char* key)
  41. {
  42. int i = 0;
  43. for (int i = 0; i < int(this->escenarios.size()); i++)
  44. {
  45. if (std::strcmp(this->escenarios[i]->getKey(), key) == 0)
  46. {
  47. this->escenarios.erase(this->escenarios.begin() + i);
  48. return;
  49. }
  50. }
  51. }
  52.  
  53. void CCordinador::clearEscenarios()
  54. {
  55. this->escenarios.clear();
  56. }
  57.  

Donde uso Cordinador....
Código
  1. //head
  2. #pragma once
  3.  
  4. #include "Cordinador.h"
  5.  
  6. class CApp
  7. {
  8. public:
  9. CApp(sf::RenderWindow *widows);
  10.  
  11. /*Parte del siclo de vida del juego*/
  12. void loopGame();
  13. void catchEvent();
  14. void clearScreen();
  15.  
  16. void update(sf::Event);
  17. void draw();
  18. void displayWindows();
  19.  
  20.  
  21. /*Armado del juego*/
  22. static sf::RenderWindow *window;
  23. void setCordinador(CCordinador *c) { this->cordinador = c; }
  24. private:
  25. CCordinador *cordinador;
  26. };
  27.  
  28. //cpp
  29. //solo puse donde lo uso por que es mucho si no xD
  30. void CApp::update(sf::Event evento)
  31. {
  32. if (evento.type == sf::Event::Closed)
  33. {
  34. this->window->close();
  35. return;
  36. }
  37.  
  38. if (this->cordinador->getEscenario()->isEndEscena(evento))
  39. {
  40. //regresa siempre true de la clase base, y no false de la clase derivada
  41.  
  42. //Un momento del juego termino y pasa al siguiente
  43. //ej: menues, niveles, etc
  44. this->cordinador->nextEscenario();
  45. }
  46.  
  47. this->cordinador->getEscenario()->updateSprites(evento);
  48. }
  49.  

y el main infaltable :p
Código
  1. #include <SFML/Graphics.hpp>
  2.  
  3. #include "App.h"
  4.  
  5. #include "HelloSprite.h"
  6. #include "HelloEscena.h"
  7.  
  8. int main()
  9. {
  10. // Create the main window
  11. sf::RenderWindow win(sf::VideoMode(800, 600, 32), "Hello World - SFML");
  12.  
  13. //Definimos los sprites:
  14. CHello sprite;
  15.  
  16. //Definimos los escenario:
  17. //imprimira en pantalla en orden de pila de como se le fue agregando al escenario
  18. CEscenario test;
  19. test.addSprite(&sprite);
  20.  
  21. //Cargamos los Escenarios al Cordinador
  22. CCordinador cordinador;
  23. cordinador.addEscenario(&test);
  24.  
  25. //Le damos al App el cordinador
  26. CApp app(&win);
  27. app.setCordinador(&cordinador);
  28.  
  29. //Empezamos el juego
  30. app.loopGame();
  31.  
  32. return 0;
  33. }
  34.  

Desde ya muchas gracias por leer.


« Última modificación: 22 Octubre 2014, 04:12 am por CSQCasimiro » En línea

"Mejora el Algoritmo, no el Código"
"Buscando todos los días ser mejor que ayer"
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Poner metodo fuera de una clase
Java
.hack// 5 9,086 Último mensaje 17 Mayo 2007, 05:57 am
por .hack//
Llamar a un metodo de una misma clase C++
Programación C/C++
d00ze13 2 13,334 Último mensaje 9 Junio 2011, 18:48 pm
por d00ze13
Llamar metodo de una clase desde otra en asp.net
Desarrollo Web
jabedoya 0 2,320 Último mensaje 26 Mayo 2014, 18:56 pm
por jabedoya
Acceso método de clase base/madre
Programación C/C++
julianbesso1 3 2,763 Último mensaje 1 Septiembre 2014, 12:59 pm
por eferion
Como sobre-escribir un método de una clase base en una clase heredada?
Programación C/C++
julian21931500 5 3,512 Último mensaje 25 Febrero 2015, 23:49 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines