RazzorFlame Temat założony przez niniejszego użytkownika |
Wektor z wskaźnikami. Wywołanie metody » 2013-06-26 17:25:34 Otóż chciałem sobie zrobić menadżer obiektów GUI... Mam taki kod: GUI_Manager.h #ifndef GUI_MANAGER_H_INCLUDED #define GUI_MANAGER_H_INCLUDED
#include "GUI_Button.h" #include "GUI_EditBox.h"
enum GUI_EventID { E_Null, E_ReturnedValue, E_GainedFocus, E_LostFocus };
class GUI_Event { public: GUI_EventID m_Type; unsigned int m_ElementID; std::string m_TextValue; int m_IntValue; GUI_Event( unsigned int id, GUI_EventID type = E_Null, std::string textvalue = "", int _intvalue = 0 ); std::string getTextValue(); int getIntValue(); };
class GUI_Manager { vector < GUI_Element *> m_Elements; GUI_Event m_EventType; public: void addElement( GUI_Element * ); GUI_Element * getElement( unsigned int id ); GUI_Event getEvent( GameWindow * ); void drawAll( GameWindow * ); };
#endif
GUI_Manager.cpp #include "GUI_Manager.h"
GUI_Event::GUI_Event( unsigned int id, GUI_EventID type, std::string textvalue, int _intvalue ) { m_ElementID = id; m_Type = type; m_TextValue = textvalue; m_IntValue = _intvalue; } int GUI_Event::getIntValue() { return m_IntValue; } std::string GUI_Event::getTextValue() { return m_TextValue; }
void GUI_Manager::addElement( GUI_Element * el ) { m_Elements.push_back( el ); } GUI_Element * GUI_Manager::getElement( unsigned int id ) { return m_Elements[ id ]; } GUI_Event GUI_Manager::getEvent( GameWindow * win ) { if( m_Elements.size() > 0 ) { for( unsigned int i = 0; i < m_Elements.size(); i++ ) { if( m_Elements[ i ]->wasPressed( win ) ) { for( unsigned int i2 = 0; i2 < m_Elements.size(); i2++ ) { if( i != i2 ) m_Elements[ i2 ]->setActive( false ); } return GUI_Event( i, E_GainedFocus ); } else if( !m_Elements[ i ]->wasPressed( win ) && i == m_Elements.size() - 1 ) { return GUI_Event( 0, E_LostFocus ); } } std::string val; for( unsigned int i = 0; i < m_Elements.size(); i++ ) { if( m_Elements[ i ]->getType() == "EDITBOX" ) val = m_Elements[ i ]->checkTextEntered( win ); if( val != "" ) return GUI_Event( i, E_ReturnedValue, val ); } return GUI_Event( 0 ); } else return GUI_Event( 0 ); }
void GUI_Manager::drawAll( GameWindow * win ) { if( m_Elements.size() > 0 ) { for( unsigned int i = 0; i < m_Elements.size(); i++ ) { m_Elements[ i ]->draw( win ); } } }
Wyskakuje błąd że klasa nie ma takiej metody. No bo nie ma, ale to wskaźnik! Jak moge tym wskaźnikiem wywołać metode która znajduje się TYLKO w klasie pochodnej GUI_EditBox. |
|
pekfos |
» 2013-06-26 17:39:57 Rzutuj w dół. |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2013-06-26 17:42:33 Widze mam jakieś braki z kursu. Co to znaczy, i najlepiej linka :D Edit: Mam: Rzutowanie w górę i w dółAle nie rozumiem o co tu chodzi... Jak mógłbym to zrobić jeśli nie mam w czasie kompilacji żadnego obiektu? |
|
jankowalski25 |
» 2013-06-26 17:49:33 nie mam w czasie kompilacji żadnego obiektu |
Nie musisz mieć obiektów, wystarczą wskaźniki do nich. |
|
pekfos |
» 2013-06-26 17:52:11 Jak mógłbym to zrobić jeśli nie mam w czasie kompilacji żadnego obiektu? |
Rzutowanie w dół w C++ dotyczy tylko wskaźników i służy do tego dynamic_cast <> . |
Jak ty czytałeś? :P |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2013-06-26 18:00:00 Znaczy to to wiem ale jak to zrealizować. Mam w pętli tworzyć nowy obiekt GUI_EditBox i użyć dynamic_cast do przekonwertowania tego wskaźnika na GUI_EditBox? Czyli coś w tym stylu: for( unsigned int i = 0; i < m_Elements.size(); i++ ) { if( m_Elements[ i ]->getType() == "EDITBOX" ) { GUI_EditBox * box = dynamic_cast < GUI_EditBox *>( m_Elements[ i ] ); val = box->checkTextEntered( win ); } if( val != "" ) return GUI_Event( i, E_ReturnedValue, val ); }
???????? |
|
pekfos |
» 2013-06-26 18:20:09 W lekcji, do której link podałeś, jest przykład. Tak, mniej więcej w taki sposób, tylko twój opis jest do niczego. |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2013-06-26 18:47:20 No źle to opisałem, ale spróbuje w ten sposób i dam odp :P
Edit: Działaaa! YEAH |
|
« 1 » |