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

Na jaką klasę wskazuje wskaźnik

Ostatnio zmodyfikowano 2011-12-27 13:33
Autor Wiadomość
unimator
Temat założony przez niniejszego użytkownika
Na jaką klasę wskazuje wskaźnik
» 2011-12-27 12:01:25
Jak w temacie :P Jak sprawdzić na jaką klasę wskazuje wskaźnik? I jaki postawić warunek np. w if, żeby sprawdzić czy wskaźnik wskazuje na daną klasę. Próbuje tak: if(wskaznik == Klasax) ale otrzymuje błąd "expected primary-expression before ')' token"
P-46361
DejaVu
» 2011-12-27 12:09:26
Podaj przykładowy fragment kodu.

/edit:
W każdym razie można sprawdzać typ klasy na kilka sposobów:
C/C++
class Bazowa
{
};
class Potomna
    : public Bazowa
{
};
Bazowa * b = new Potomna;
Potomna * a = dynamic_cast < Potomna *>( b );
if( a != NULL )
{
    //OK
} //if
dynamic_cast nie zawsze zadziała tak jakbyśmy tego chcieli - przeczytaj na MSDN-ie co jest napisane na temat tego słowa kluczowego.
P-46363
waxx
» 2011-12-27 12:18:34
Wydaje mi sie ze cokolwiek chcesz zrobic mozna to lepiej zaimplementowac ;p
P-46364
unimator
Temat założony przez niniejszego użytkownika
» 2011-12-27 12:23:34
Nie ogarniam tego forum więc sorry, że wkleję tak na czysto.
Ogólnie to pomysł mam taki: na przestrzeni 1024x768 pixeli chcę móc umieszczać klocki o rozmiarze 32x32. Klocki mają być wybierane przez użytkownika (tak jak np. w Terrari, do Minecrafta trudno to porównywać). I do tej pory mam coś takiego:
C/C++
class CBlock
{
protected:
    int pos_x; int pos_y;
   
public:
    CBlock();
    CBlock( int, int );
    virtual ~CBlock();
    int get_pos_x() { return pos_x; };
    int get_pos_y() { return pos_y; };
    void set_pos_x( int a ) { pos_x = a; };
    void set_pos_y( int b ) { pos_y = b; };
};

class CGround
    : public CBlock
{
protected:
    BITMAP * ground;
public:
    CGround() { ground = load_bmp( "graph\\ground.bmp", default_palette ); };
    CGround( int c, int d ) { pos_x = c; pos_y = d; ground = load_bmp( "graph\\ground.bmp", default_palette ); };
    ~CGround() { destroy_bitmap( ground ); delete get_ground(); };
    int get_ground_w() { return ground->w; };
    int get_ground_h() { return ground->h; };
    BITMAP * get_ground() { return ground; };
};
A w samym kodzie:
C/C++
CGround ** macierz = new CGround *[ 32 ];
for( unsigned i = 0; i < 32; ++i )
     macierz[ i ] = new CGround[ 24 ];

//(...)

if( mouse_b & 2 ) {
    Mx =( mouse_x / 32 );
    My =( mouse_x / 32 );
   
    if( tmacierz[ Mx ][ My ] == 0 )
    {
        tmacierz[ Mx ][ My ] = select;
        macierz[ Mx ][ My ] = CGround(( Mx * 32 ),( My * 32 ) );
        macierz[ Mx ][ My ].set_pos_x( Mx * 32 );
        macierz[ Mx ][ My ].set_pos_y( My * 32 );
    }
    //(..)
    for( int i = 0; i < 32; i++ )
    {
        for( int j = 0; j < 24; j++ )
        {
            if( macierz[ i ][ j ] == CGround )
                 blit( macierz[ i ][ j ].get_ground(), bufor, 0, 0, macierz[ i ][ j ].get_pos_x(), macierz[ i ][ j ].get_pos_y(), macierz[ i ][ j ].get_ground_w(), macierz[ i ][ j ].get_ground_h() );
           
        } }
Ta końcówka nie działa i właśnie o to mi chodziło w temacie ale teraz dochodzę do wniosku, że cała reszta jest przynajmniej dziwna :P
P-46366
DejaVu
» 2011-12-27 12:54:59
To nie tak się robi :) Tworzysz metodę wirtualną w klasie CBlock i nadpisujesz ją w klasie pochodnej. W Twoim przypadku będzie to metoda render.

C/C++
class CBlock
{
    virtual void render() { }
};

class CGround
    : public CBlock
{
    virtual void render()
    {
        //rysowanie klocka
    }
}

//wywołanie:
std::vector < CBlock *> v;
//...
BOOST_FOREACH( CBlock * blok, v )
if( blok )
     blok->render();
P-46370
marc_xxx
» 2011-12-27 13:27:13
Można wiedzieć co ta za funkcja BOOST_FOREACH?
P-46373
pekfos
» 2011-12-27 13:33:02
Google?
P-46374
« 1 »
  Strona 1 z 1