RazzorFlame Temat założony przez niniejszego użytkownika |
Dynamiczne obiekty/struktury - Po co? » 2013-01-31 17:27:44 Otóż od jakiegoś czasu męczy mnie niewiedza dotycząca tego tematu, bądź tego z przed kilkunastu minut (o metodach statycznych). Jakoś dziwi mnie to czemu pisze się np. tak (w allegro) Jak by nie można było napisać tak: Bo wydaje mi się że różnica pomiędzy tymi 2 obiektami (tzn. czyms ze struktury) jest taka że w 1 przypadku odwołuje się do zmiennej bitmapa za pomocą operatora '->' a w drugim za pomocą operatora '.' O co tu biega? Czy jest jakaś różnica pomiędzy taką deklaracją: CZwierze * zwierze = new CPies;
A taką: Przecież ten zapis jest krótszy. Ogólnie wiadomo, że wskaźniki pomagają czy zapis BITMAP * bitmapa czy jakikolwiek inny jest wskaźnikiem czy zmienną (czy jakoś tak bo pochodzi ze struktury) dynamiczną. Czy w ogóle to się czymś różni? BTW przecież w allegro się później nie robiło nic w stylu bitmapa = new BITMAP; tzn mogło to być w jakiś funkcjach które automatycznie to robiły. |
|
m4tx |
» 2013-01-31 17:36:07 new alokuje pamięć na stercie, a taki "standardowy" sposób - na stosie. Dodatkowo, wskaźnik niemal zawsze jest mniejszy niż struktura, a co za tym idzie - np. przekazywanie argumentów do funkcji jest szybsze :) A - i jeszcze jedno. Używaj google :P http://pl.wikibooks.org/wiki/C/Wska%C5%BAniki#O_co_chodzi |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2013-01-31 17:48:52 m4tx Przecież tam wyraźnie pisze że na stercie zmienne zajmują więcej pamięci niż na stosie. |
|
ison |
» 2013-01-31 17:58:01 @m4tx, nie o to chodzi, obiekty zaalokowane niedynamicznie też możesz przekazywać 'szybko', np wyłuskując wskaźnik albo przekazując przez referencję. Sprawa jest taka, że w C nie było czegoś takiego jak konstruktory, były po prostu struktury z określonymi polami. Aby poradzić sobie z tym problemem ludzie wymyślili wzorzec projektowy, gdzie obiekty są tworzone za pośrednictwem fabryki, tj. funkcji, która zwraca już odpowiednio utworzony obiekt. Jedną z takich funkcji-fabryk jest np. create_bitmap albo load_bitmap. Gdyby allegro było pisane w stylu C++ to tego typu wskaźniki byłyby bezużyteczne (bo dałoby się je zastąpić czymś bardziej przyjaznym), właściwie to w C++ wskaźników powinno się unikać tam gdzie jest to możliwe, w C nie było innego wyjścia. |
|
m4tx |
» 2013-01-31 18:02:22 m4tx Przecież tam wyraźnie pisze że na stercie zmienne zajmują więcej pamięci niż na stosie. |
Tak, ale sterta ma znacznie większą pojemność. Stos można przepełnić nawet za pomocą tablicy miliona long longów - wyobraź sobie np. grę, która nie może zaalokować więcej niż 8MB :) |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2013-01-31 18:13:45 Dziękuje wam. Już teraz rozumiem. Podsumowując (dla potomnych): Na zmienne utworzone za pomocą operatora new nie ma wpływu zasięg. Zmienne utworzone za pomocą operatora new są tworzone na stercie która ma większą pojemność niż stos na którym są tworzone standardowo zadeklarowane zmienne ( int zmienna ). Poza tym w C++ nie jest wymagany taki zapis int * zmienna = new int; (jak napisał Ison) ZAMYKAM. |
|
ison |
» 2013-01-31 18:24:16 Poza tym w C++ nie jest wymagany taki zapis int * zmienna = new int; |
Jeśli chcesz stworzyć zmienną dynamiczną to jest wymagany. Chodzi tylko o to, że jeśli nie musisz koniecznie używać zmiennych alokowanych dynamicznie to lepiej tego nie robić. Kwestia gustu. |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2013-03-09 15:59:28 Otwieram temat bo mam jeszcze jedno pytanie. Powiedzmy że mamy wskaźnik: string * ptr = new string; ptr = "ciag_znakow";
Teraz kiedy używamy: To czy to usuwa obiekt na który wskazuje 'ptr' czy też sam wskaźnik? Chyba że można tak zrobić: string * ptr = new string; ptr = "ciag_znakow"; delete ptr; ptr = new string; ptr = "nowy_ciag_znakow";
Wydaje mi się że nie ale zawsze się można zapytać :) |
|
« 1 » 2 |