Diskuze: dynamicke pole objektu
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 14 zpráv z 14.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Priblizne takhle:
int count = 0;
int size = 2;
Object **dynarr = new Object*[size];
void add(Object *item)
{
if (count == size)
{
int newsize = size * 2 + 1;
Object **temp = new Object*[newsize];
for (int i = 0; i < size; i++)
temp[i] = dynarr[i];
for (int i = size; i < newsize; i++)
temp[i] = NULL;
delete dynarr;
dynarr = temp;
}
dynarr[count++] = item;
}
Díky tohle je přesně to co jsem ptořeboval, a ještě když jsme u toho nešlo by tohle :
if (count == size)
{
int newsize = size * 2 + 1;
Object **temp = new Object*[newsize];
for (int i = 0; i < size; i++)
temp[i] = dynarr[i];
for (int i = size; i < newsize; i++)
temp[i] = NULL;
delete dynarr;
dynarr = temp;
}
vyměnit za samotný realloc? ten přeci pole zvětší + tam budou ty samé hodnoty co v tom bývalém + místo navíc a pamět toho bývalého jakby "uvolní" ?
Urcite by slo pouzit realloc(), ale v tom pripade bych byl konzistentni a pouzival na to pole pouze malloc, free a realloc.
Jo takhle, už to chápu, sem si to spletl c C Děkuju moc za rady a vysvětlení
teda
Můžu se ještě zeptat jak se dostat k atributu jednoho objektu v tom poli objektů ?
//zkoušel jsem
dynarr[i]->atributX;
//EDIT : prosím o smazani tohoto příspěvku, visualko už mi to konečně
povolilo, bylo to co sem vepsal do ukázky
Tak nakonec mám problem nějak s tím ještě, ono mi to sice uloží do toho, ale když pak chcu vypsat jednotlivé prvky toho pole dvojtého, tak mi to vypíše bláboly, ne ten záznam jeden :/ nebude někde chyba nebo tak?
for(int i=0 ; i<count ; i++)
{
cout << dynarr[i]->GID <<","<<dynarr[i]->GName<<","<<dynarr[i]->GDescription<<","<<dynarr[i]->GPrice<<","<<dynarr[i]->GNoItems << endl;
}
Dovoluji si jen upozornit, že pokud by to někdo někdy vyhledal tady, tak
ve fci add() napsané výše je jedna menší chyba. Proto tu dávám opravný
kod
int count = 0;
int size = 2;
Object **dynarr = new Object*[size];
void add(Object *item)
{
if (count == size)
{
int newsize = size * 2 + 1;
Object **temp = new Object*[newsize];
for (int i = 0; i < size; i++)
temp[i] = dynarr[i];
for (int i = size; i < newsize; i++)
temp[i] = NULL;
size=newsize;//tohle tu nebylo, neboli se neaktualizovalo velikost pole :)
delete dynarr;
dynarr = temp;
}
dynarr[count++] = item;
}
Co to přesně vypisuje a co by to mělo vypisovat? Možná by bylo dobré sem dát celý kód včetně té třídy. Jenom bych podotknul, že zvětšovat pole přidání každého prvku je poněkud neefektivní, lepší je velikost třeba zdvojnásobit nebo přidat určitý počet prvků a když se zaplní tak zopakovat.
realloc() se v takovém případě použít nedá, nezavolá totiž destruktory objektů. S objekty umí pracovat jen new a delete.
On by ale reallocoval pouze pole pointerů, na těch žádný destruktor volat nemusí.
Ale ne, já vím že ten realloc nejde, jak říkám spletl jsem si c a c++
dynamická pole:D jsem si akorát neuvědomil že realloc se nepoužívá s new
a delete ale malloc a free
malloc, realloc a free mozes pouzivat aj v c++. Len si treba uvedomit ze rozne allocatory su vecsinou nekompatibilne, takze ked alokujes cez malloc/realloc, uvolnovat musis cez free, ked allokujes cez new, tak dealokujes cez delete. Dalsi rozdiel je ze funkcie malloc/realloc len alokuju pamet, neinicialiuju ju(nevolaju constructory, ninicializuju vptr...) a free len uvolnuje pamet(nevola destructory). Destructory mozes manualne volat ako ine metody. Na zavolanie konstruktoru mozes pouzit placement new.
#include <iostream>
struct MenoTriedy{
static int g_i;
int i;
MenoTriedy():i(++g_i){std::cout << "create: " << i << '\n';}
virtual ~MenoTriedy(){std::cout << "destroy: " << i << '\n';}
};
int MenoTriedy::g_i = 0;
int main(){
size_t size = 2;
MenoTriedy* ptr = (MenoTriedy*)malloc(sizeof(MenoTriedy) * size);
new(ptr) MenoTriedy();
new(ptr+1) MenoTriedy();
size += 2;
ptr = (MenoTriedy*)realloc(ptr, sizeof(MenoTriedy) * size);
new(ptr+2) MenoTriedy();
new(ptr+3) MenoTriedy();
for(size_t i = 0; i < size; ++i)
ptr[i].~MenoTriedy();
return 0;
}
Na implementaciu vectora sa da dobre pouzit malloc/realloc.
Zobrazeno 14 zpráv z 14.