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

Dziedziczenie - problem ze zmiennymi klasy.

Ostatnio zmodyfikowano 2010-03-24 21:40
Autor Wiadomość
dmx81
Temat założony przez niniejszego użytkownika
Dziedziczenie - problem ze zmiennymi klasy.
» 2010-03-23 19:26:34
witam ponownie

z klasy bazowej utworzylem klase pochodna, dopisalem w jej "ciele" dodatkowo 4 zmienne, w ciele kontruktora narzucilem wartosci = 0.
nastepnie tworze wskaznik na klase bazowa (probowalem tez na pochodna), dynamicznie tworze obiekt klasy pochodnej, dopisuje utworzony obiekt do wektora.
problem polega na tym, ze kompilator mowi mi, ze klasa bazowa nie ma takiego czlonka - czyli tych dopisanych do klasy bazowej zmiennych
C/C++
class C_poziom1
{
public:
    int i_x, i_y, i_s, i_w;
    bool b_disp;
    BITMAP * obrazek;
    C_poziom1() { }
    C_poziom1( int x, int y, int s, int w )
        : i_x( x )
        , i_y( y )
        , i_s( s )
        , i_w( w )
    { }
   
};

class C_ROZBITEK
    : public C_poziom1
{
public:
    bool uratowany;
    int miejsce_w_srodku;
    short pozycjax, pozycjay;
    C_ROZBITEK();
    C_ROZBITEK( int & tabx, int & taby, int s, int w );
};
C_ROZBITEK::C_ROZBITEK()
{
    uratowany = NULL;
    pozycjax = 0;
    pozycjay = 0;
    miejsce_w_srodku = 0;
}
C_ROZBITEK::C_ROZBITEK( int & tabx, int & taby, int s, int w )
{
    i_x = tabx;
    i_y = taby;
    i_s = s;
    i_w = w;
    uratowany = NULL;
    pozycjax = tabx;
    pozycjay = taby;
    miejsce_w_srodku = 0;
}

std::vector < C_poziom1 *> obiekt2;

C_ROZBITEK * wskaznik = NULL;

for( int y = 0; y < 9; y++ )
{
    wskaznik = new C_ROZBITEK( rozbitekx[ y ], rozbiteky[ y ], 9, 17 );
    wskaznik->obrazek = load_bmp( "rozbitek.bmp", default_palette );
    wskaznik->b_disp = true;
    wskaznik->uratowany = NULL;
    obiekt2.push_back( wskaznik );
}
jesli usune te nowo dopisane zmienne, wtedy nie ma problemu i program dziala bez zarzutu, no a potrzebuje tych dodatkowych zmiennych, przeciez po to jest to dziedziczenie... domyslam sie, ze cos robie zle skoro nie dziala, ale jeszcze nie wiem co...


i mam takie dodatkowe pytania:
1. tworzac obiekt klasy pochodnej, czy jest on ciagle tez typu klasy bazowej?
2. dlaczego program wyrzuca mi blad, ze w klasie bazowej nie ma czlonka o takiej nazwie... skoro to logiczne, ze go tam nie ma, bo powstal dopiero w klasie pochodnej
P-15420
malan
» 2010-03-24 18:38:54
@dmx81: Rozwiązałeś problem i temat zamknąłeś, czy "sam" się zamknął?
P-15428
dmx81
Temat założony przez niniejszego użytkownika
» 2010-03-24 18:56:41
problem ktory opisalem, rozwiazalem - popelnilem blad nastepujacy:
utworzylem niby wszytsko ok, poza tym, ze wektor mial przechowywac obiekty, ale klasy bazowej, zmienilem to na klase pochodna i juz ok

ale skoro temat "sie otworzyl" to mam inne pytanie:

dotad mialem sprawdzenie kolizji koloru (getpixel....) i wylaczalem z tej kolizji pewne obiekty, ktore kolizji nie mialy powodowac...poniewaz obiektow przybywalo, a tylko kopiowalem dalej &&!(kolizja(obiekt1,x,y))&&!(kolizja(obiekt2,x,y)...itd
postanowilem obiekty schowac do wektora, po czym zrobic podobnie jak wczesniej, ale teraz dla petli
C/C++
for( int i = 0; i < wektor.size(); i++ ) if( kolizja( wektor[ i ], x, y ) { return true; break; }
else return false;
mam nadzieje ze wiadomo o co chodzi, mimo takiego zapisu, kolizja z jakimkolwiek obiektem pooduje zadzialanie kolizji - a jesli te obiekty wymienie pojedynczo, jak np if kolizja wektor[1].....wektor[20] to dziala poprawnie, czyli nie powoduje zadzialania kolizji
P-15432
malan
» 2010-03-24 19:14:45
Ehh...:
Jednek problem = jeden temat.

Po cichu pokaż funkcje kolizja.

Na przyszłość: jak rozwiążesz temat sam to napisz rozwiązanie, a potem go zamknij.
P-15433
dmx81
Temat założony przez niniejszego użytkownika
» 2010-03-24 21:40:29
kto chce moze czytac...ale ROZWIAZANE:)  PS3 napisalem jak

szybkie wyjasnienie kodu aby analiza przebiegla szybko i sprawnie:)
kolizje to wiadomo, jesli jeden z obiektow nachodzi na siebie z drugim, inna kolizja to sprawdzanie punktu, czy nasz obiekt i sprawdzany punkt sie pokrywaja = roznia sie tez one argumentami, bo raz jest to na wskaznikach a raz na obiektach
(bede to tez optymalizowal nieco - juz skrocilem kod o prawie 300 linijek dzieki wlasnie wprowadzeniu wektorow - wczesniej kazdy obiekt deklarowalem osobno, kazda kolizje osobno - a teraz wszystko w petlach - ale wlasnie napotkalem na ten problem)
wracajac do watku, petle for sluza do sprawdzenia kazdego punktu- czy haczymy dolem, bokiem itd, pozniej sprawdzenie koloru i wykluczenie tych obiektow, ktore nie maja powodowac kolizji - dopoki mialem wypisany kazdy obiekt osobno, dzialalo ok, teraz dalem te obiekty do wektora obiekt2, i jak na nie najade - mam kolizje, a na pozostale obiekty, ktore wciaz sa jeszcze nie w wektorach i wymienilem osobno - nie pooduja kolizji - a chce je tez wrzucic w petle zamiast wymieniac pojedynczo. interesuje mnie jak rozwiazac kolizje wlasnie z obiektami z wektora - poki co mam, ze jesli okaze sie ze kolor inny niz rozowy, to sprawdzam, czy to nie ktorys z neutralnych obiektow - jesli np to obiekt z wektora, to funkcja przy pierwszym napotkanym obiekcie zwroci true i przerwie petle, wiec funkcja zwroci true - czyli warunek kolizji nie zostanie spelniony...

C/C++
bool kolizja( C_poziom1 POSTAC, C_poziom1 * POSTAC2 )
{
    if( POSTAC.i_x + POSTAC.i_s >= POSTAC2->i_x && POSTAC.i_y + POSTAC.i_w >= POSTAC2->i_y && POSTAC.i_x <= POSTAC2->i_x + POSTAC2->i_s && POSTAC.i_y <= POSTAC2->i_y + POSTAC2->i_w )
         return true;
    else return false;
   
}


bool kolizja( std::vector < C_ROZBITEK *> obiekt, int x, int y )
{
    for( int a = 0; a < obiekt.size(); a++ )
    {
        if( x >= obiekt[ a ]->i_x && y >= obiekt[ a ]->i_y && x <= obiekt[ a ]->i_x + obiekt[ a ]->i_s && y <= obiekt[ a ]->i_y + obiekt[ a ]->i_w )
        {
            return true;
            a = obiekt.size() + 1;
        }
        else return false;
       
    }
}

bool kolizja( int x, int y, C_poziom1 * POSTAC2 )
{
    if( x >= POSTAC2->i_x && y >= POSTAC2->i_y && x <= POSTAC2->i_x + POSTAC2->i_s && y <= POSTAC2->i_y + POSTAC2->i_w )
         return true;
    else return false;
   
}

bool kolizja( C_poziom1 POSTAC, C_poziom1 POSTAC2 )
{
    if( POSTAC.i_x + POSTAC.i_s >= POSTAC2.i_x && POSTAC.i_y + POSTAC.i_w >= POSTAC2.i_y && POSTAC.i_x <= POSTAC2.i_x + POSTAC2.i_s && POSTAC.i_y <= POSTAC2.i_y + POSTAC2.i_w )
         return true;
    else return false;
   
}

for( int i = ludek.i_x; i <= ludek.i_x + ludek.i_s; i++ )
{
    for( int j = ludek.i_y; j <= ludek.i_w + ludek.i_y; j++ )
    {
       
       
        if(( getpixel( bufor, i, j ) != makecol( 140, 180, 255 ) ) &&!( kolizja( obiekt2, i, j ) )
        &&!( kolizja( ludek, ladowisko1 ) ) &&!( kolizja( ludek, ladowisko2 ) ) &&!( kolizja( ludek, ladowisko3 ) )
        &&!( kolizja( i, j, drabina ) ) &&!( kolizja( i, j, dystrybutor1 ) ) &&!( kolizja( i, j, dystrybutor2 ) )
        &&!( kolizja( i, j, dystrybutor3 ) ) )
        {
            // tu np animacja kolizji itd//
            else
            //cos tam i wychodzi z petli sprawdzania//

PS - dziala ok tylko dla pierwszego obiektu, nie koliduje z nim, a drugi i kazdy inny juz koliduje, czyli cos blisko jest, ale nie do konca

PS2 - zauwazylem, ze zmieniajac 0 na 1 w petli for dla kolizji wektora, dziala drugi obiekt, pierwszy nie - czyli jakby petla nie leciala cala ...

PS3 - rozwiazalem :)
blad zrobilem pisujac return w pelti for, wprowadzilem nowa zmienna, ktora=1 gdy kolizja==true, inaczej=0, a poza petla jesli z=1, return true, else return false
P-15434
« 1 »
  Strona 1 z 1