Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wektor z wskaźnikami. Wywołanie metody

Ostatnio zmodyfikowano 2013-06-26 18:47
Autor Wiadomość
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
C/C++
#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_H_INCLUDED
GUI_Manager.cpp
C/C++
#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;
}

//GUI_Manager

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 )
    {
        //check some obiect gaining focus
        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 ); //TUTAJ BŁĄD
           
            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.
P-86229
pekfos
» 2013-06-26 17:39:57
Rzutuj w dół.
P-86231
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: » Programowanie obiektowe, C++ » PolimorfizmRzutowanie w górę i w dół lekcja
Ale nie rozumiem o co tu chodzi... Jak mógłbym to zrobić jeśli nie mam w czasie kompilacji żadnego obiektu?
P-86232
jankowalski25
» 2013-06-26 17:49:33
nie mam w czasie kompilacji żadnego obiektu
Nie musisz mieć obiektów, wystarczą wskaźniki do nich.
P-86233
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
P-86234
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:
C/C++
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 );
   
}
????????
P-86236
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.
P-86240
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
P-86247
« 1 »
  Strona 1 z 1