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

vector obiektow wlasnej klasy

Ostatnio zmodyfikowano 2010-02-04 00:53
Autor Wiadomość
malan
» 2010-02-03 20:40:25
Nie. Chodziło mi o to, że delete używamy tuż przed zakończeniem programu (lub w destruktorze(?)).
P-13543
dmx81
Temat założony przez niniejszego użytkownika
» 2010-02-03 21:00:39
no domyslilem sie, ze delete to juz na koniec programu (lub jesli obiekt przestaje istniec i wtedy juz sie go nie wywoluje)
dzieki za podp
P-13544
dmx81
Temat założony przez niniejszego użytkownika
» 2010-02-03 22:46:01
jestem juz po malej przebudowie kodu - w wiekszosci definicji funkcji zamiast "."musialem wstawic "->", kod troszke sie tez skrocil, bo zamiast wypisywac powtarzajace sie regulki, uzywam petli, pojawil sie jeden problem
C/C++
C_poziom1();
C_poziom1( int x, int y, int s, int w );
to moje konstruktory
C/C++
C_poziom1 ludek( 5, 200, 15, 30 );
ludek.obrazek = load_bmp( "ludek.bmp", default_palette );
tak tworzylem dotad obiekty, a teraz wylada to tak
C/C++
short tab_x[ 7 ] = { 0, 100, 0, 240, 100, 0, 720 };
short tab_y[ 7 ] = { 100, 250, 400, 550, 550, 50 };
short wysokosc_obrazka = 5;
short szerokosc_obrazka[ 7 ] = { 600, 700, 500, 500, 30, 30, 70 };

C_poziom1 * podloga = new C_poziom1;
for( int i = 0; i < 7; i++ )
{
    podloga->obrazek = load_bmp( "kreska.bmp", default_palette );
    podloga->i_x = tab_x[ i ];
    podloga->i_y = tab_y[ i ];
    podloga->b_disp = true;
    podloga->i_s = szerokosc_obrazka[ i ];
    podloga->i_w = wysokosc_obrazka;
    obiekt.push_back( podloga );
}
oczywiscie pojedynczy obiekt, jak ludek, chcialbym dalej tworzyc jak wczesniej

a problem jest taki, ze przy
C/C++
C_poziom1 * podloga = new C_poziom1;
mam blad
main.cpp|73|undefined reference to `C_poziom1::C_poziom1()'

ten problem znika, jak usune konstruktor
C/C++
C_poziom1( int x, int y, int s, int w );
ale wtedy ludek ma blad, ze zle utworzony obiekt. wiem, ze moge inaczej teraz tworzyc ludka, ale to tylko obejscie problemu, a jak go rozwiazac, aby tworzyc w dwojaki sposob obiekty?


ps. zmienilem kod na

C/C++
short tab_x[ 7 ] = { 0, 100, 0, 240, 100, 0, 720 };
short tab_y[ 7 ] = { 100, 250, 400, 550, 550, 50 };
short wysokosc_obrazka = 5;
short szerokosc_obrazka[ 7 ] = { 600, 700, 500, 500, 30, 30, 70 };

C_poziom1 * podloga = NULL;
for( int i = 0; i < 7; i++ )
{
    podloga = new C_poziom1;
    podloga->obrazek = load_bmp( "kreska.bmp", default_palette );
    podloga->i_x = tab_x[ i ];
    podloga->i_y = tab_y[ i ];
    podloga->b_disp = true;
    podloga->i_s = szerokosc_obrazka[ i ];
    podloga->i_w = wysokosc_obrazka;
    obiekt.push_back( podloga );
}

ale tez nic nie pomoglo, ale chyba bardziej poprawnie?


ps2. juz naprawilem:

C/C++
for( int i = 0; i < 7; i++ )
{ podloga = new C_poziom1( tab_x[ i ], tab_y[ i ], szerokosc_obrazka[ i ], wysokosc_obrazka );
P-13550
malan
» 2010-02-03 23:33:16
Nie zapomniałeś czasem zdefiniować tego konstruktora?
C/C++
C_poziom1::C_poziom1()
{
};

// edit (23:35)
Jeśli chciałbyś użyć tego 2 konstruktora to jakoś tak będzie:
C/C++
for( int i = 0; i < 7; i++ )
{
    C_poziom1 * podloga = new C_poziom1( tab_x[ i ], tab_y[ i ], szerokosc_obrazka[ i ], wysokosc_obrazka );
    podloga->obrazek = load_bmp( "kreska.bmp", default_palette );
    //podloga->i_x=tab_x[i];
    //podloga->i_y=tab_y[i];
    podloga->b_disp = true;
    //podloga->i_s=szerokosc_obrazka[i];
    //podloga->i_w=wysokosc_obrazka;
    obiekt.push_back( podloga );
}
..., ale to nie ładnie wygląda ;p.
P-13551
dmx81
Temat założony przez niniejszego użytkownika
» 2010-02-04 00:53:49
konstruktory mialem zdefioniowane obydwa :)
poki co kod sie kompiluje, ale teraz mam inny problem, nie dzialaja kolizje

C/C++
if( wznoszenie == true )
{
    for( int i = 1; i <= wartosc_podskoku; i++ ) //po pikselu czy po zmianie ludek.yo wartosc skoku nie pominiemy kolizji//
    {
        ludek.i_y--;
        for(; iter1 != iter2; iter1++ ) //iter1 - obiekt.begin(), iter2 - end - po kolei czy kolizja z jakims obiektem//
        {
            if( kolizja( ludek, * iter1 ) )
            {
                ludek.i_y =( * iter1 )->i_y +( * iter1 )->i_w; //czyli glowa dotyka sufitu
                wznoszenie = false; //wylaczenie wznoszenia
                i = wartosc_podskoku; / warunek wyjscia z petli
                iter1 = iter2; //warunek wyjscia z petli
            }
           
        }
    }
   
}


a to poprzednia wersja,gdzie zamiast wskaznikow, przetrzymywalem w vector obiekty, wersja dzialajaca dobrze, z kolizjami

C/C++
if( wznoszenie == true )
{
    for( int i = 1; i <= wartosc_podskoku; i++ )
    {
        ludek.i_y--;
        for( int j = 0; j < obiekt.size(); j++ )
        {
            if( kolizja( ludek, obiekt[ j ] ) )
            {
                ludek.i_y = obiekt[ j ].i_y + obiekt[ j ].i_w;
                wznoszenie = false;
                i = wartosc_podskoku;
            }
           
        }
    }
   
   
}

ok nie wazne, chcialem cos przedobrzyc z tymi iteratorami - na pewno tez jest sposob, aby za ich pomoca to wykonac, ale poki co poradzilem sobie jak w poprzednim przykladzie
P-13552
1 « 2 »
Poprzednia strona Strona 2 z 2