Na jaką klasę wskazuje wskaźnik
Ostatnio zmodyfikowano 2011-12-27 13:33
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" |
|
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:
class Bazowa { }; class Potomna : public Bazowa { }; Bazowa * b = new Potomna; Potomna * a = dynamic_cast < Potomna *>( b ); if( a != NULL ) { }
dynamic_cast nie zawsze zadziała tak jakbyśmy tego chcieli - przeczytaj na MSDN-ie co jest napisane na temat tego słowa kluczowego. |
|
waxx |
» 2011-12-27 12:18:34 Wydaje mi sie ze cokolwiek chcesz zrobic mozna to lepiej zaimplementowac ;p |
|
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:
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:
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 |
|
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.
class CBlock { virtual void render() { } };
class CGround : public CBlock { virtual void render() { } }
std::vector < CBlock *> v;
BOOST_FOREACH( CBlock * blok, v ) if( blok ) blok->render(); |
|
marc_xxx |
» 2011-12-27 13:27:13 Można wiedzieć co ta za funkcja BOOST_FOREACH? |
|
pekfos |
» 2011-12-27 13:33:02 Google? |
|
« 1 » |