dmx81 Temat założony przez niniejszego użytkownika |
Dziedziczenie - zmienna typu static » 2010-03-27 00:14:08 mam klase bazowa, w niej zmienna static i jakies inne - kontruktor klasy bazowej ustawia wartosci pozostalych zmiennych poprzez argumementy, a w ciele kontruktora zeruje zmienna statyczna - wszytskie zmienne public. nastepnie tworze klase pochodna - dziedzicze wszytskie zmienne + dodaje jakies nowe. dziedziczone zmienne teraz nie beda przyjmowac wartosci argumentow int, ale beda pobierac je z tablicy,wiec podaje w kontruktorze int* w ciele funkcji definiuje ta zmienna statyczna - ale wyskakuje blad, ze undefined reference - i mam pytanie, jak ja mam wyzerowac w innych klasach pochodnych, w ciele kontruktora? moze jakis przyklad? i drugie pytanie, jak powinien wygladac prawidlowo kontruktor tej drugiej klasy 1. class C_KLASA_BAZOWA1 { public: int i_x, i_y, i_s, i_w; bool b_disp; static short klatka, licznik; BITMAP * obrazek; C_KLASA_BAZOWA1() { } C_KLASA_BAZOWA1( int x, int y, int s, int w ) : i_x( x ) , i_y( y ) , i_s( s ) , i_w( w ) { klatka = 0, licznik = 0; } virtual void rysuj( BITMAP * bufor ); };
C_ROZBITEK::C_ROZBITEK( int & tabx, int & taby, int s, int w ) : C_KLASA_BAZOWA1( i_x, i_y, i_s, i_w ) { i_x = tabx; i_y = taby; i_s = s; i_w = w; miejsce_w_srodku = 0; uratowany = NULL; klatka = 0; licznik = 0; }
czy C_ROZBITEK::C_ROZBITEK( int & tabx, int & taby, int s, int w ) : C_KLASA_BAZOWA1( i_x, i_y, i_s, i_w ) { miejsce_w_srodku = 0; uratowany = NULL; klatka = 0; licznik = 0; }
czy jeszcze inaczej? - obydwa nie wyrzucaja bledow i sie kompiluja, ale nie wiem, bo teraz ustawiam wartosci wg tablicy a nie konkretnych zmiennych (w petli bedzie) p.s. doczytalem gdzies, ze dziedziczona zmienna statyczna przejmuje wartosc z klasy bazowej, tzn obiekt klasy pochodnej nie bedzie mial "osobnej" zmiennej statycznej, bedzie jedna dla wszytskich obiektow klasy bazowej i pochodnych... a ja potrzebuje miec osobne, wiec chyba nie ma sensu jej dziedziczenia w tym przypadku:/ ale pytanie wciaz aktualne, jak ustawic wartosc tych zmiennych, ktore sa dziedziczone, ale nie pobieraja argumentow z konstruktora, a w ciele kontruktora klasy pochodnej wyrzuca blad ze undefined reference, bo chyba nie ustawia wartosci z ciala kontruktora klasy bazowej? wiec jak mam to ustawic (no wiem ze przy tworzeniu obiektu bede mogl sam ustawic, ale chce to zrobic w konstruktorze...) |
|
madmike44 |
» 2010-03-27 10:45:11 1. Deklaracja zmiennej statycznej znajduje się w ciele klasy, natomiast jej definicję (być może z przypisaniem wartości) umieszcza się poza ciałem klasy - tak, żeby miała zakres pliku. Czyli umieszczasz tę definicję tam, gdzie masz definicje funkcji składowych (najlepiej na początku pliku). 2. Składnik statyczny jest tworzony w pamięci jednokrotnie i jest wspólny dla wszystkich utworzonych obiektów danej klasy - również dla obiektów klas pochodnych. No i przykład deklaracji klasy ze składnikiem statycznym: class klasa { public: float zmienna; static int skladnik; };
oraz definicji: int klasa::skladnik = 44;
|
|
dmx81 Temat założony przez niniejszego użytkownika |
» 2010-03-27 11:56:06 ok, dziekuje bardzo za odpowiedz :) drugie pytanie, byc moze retoryczne, jesli zalezy mi na tym, aby kazda klasa miala swoja wlasna statyczna zmienna (na potrzeby animacji - klatka animacji - decydujaca o wyborze klatki z bitmapy i licznik animacji - decydujacy o predkosci animacji) - to musialbym utworzyc osobne zmienne statyczne w kazdej z klas, i najlepiej dac je na private, aby nie byly dziedziczone? albo ewentualnie klasa abstrakcyjna, a zniej utworzyc "podklasy" kazda juz ze zmienna statyczna... i rozumiem, ze tak utworzone static beda widziane tylko dla obiektow danej klasy? |
|
madmike44 |
» 2010-03-29 20:37:53 1. To chyba oczywiste - każda klasa ma mieć własną zmienną statyczną - w każdej klasie tworzysz jej własną zmienną statyczną :)
2. W kontekście dziedziczenia etykieta (private, public, protected) nie decyduje o tym, czy coś jest dziedziczone, czy nie - decyduje o tym, czy odziedziczone elementy są dostępne w klasie pochodnej.
3. Jeżeli zadeklarujesz składnik klasy jako private, to będzie on dostępny tylko dla obiektów danej klasy, niezależnie od tego, czy ten składnik jest zmienną statyczną, zwykłą zmienną, czy też funkcją składową. |
|
« 1 » |