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

Dynamiczne obiekty/struktury - Po co?

Ostatnio zmodyfikowano 2013-03-10 11:28
Autor Wiadomość
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)
C/C++
BITMAP * bitmapa = NULL;
Jak by nie można było napisać tak:
C/C++
BITMAP bitmapa = NULL;
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ą:
C/C++
CZwierze * zwierze = new CPies;

A taką:

C/C++
CPies zwierze;
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.
P-75463
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
P-75464
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.
P-75465
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.
P-75467
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 :)
P-75469
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.
P-75472
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.
P-75474
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:
C/C++
string * ptr = new string;
ptr = "ciag_znakow"; //to tak dla picu ;p
Teraz kiedy używamy:
C/C++
delete ptr;
To czy to usuwa obiekt na który wskazuje 'ptr' czy też sam wskaźnik? Chyba że można tak zrobić:
C/C++
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ć :)
P-77977
« 1 » 2
  Strona 1 z 2 Następna strona