Diskuze: dynamicke pole objektu

C++ C a C++ dynamicke pole objektu

Avatar
MrPabloz
Člen
Avatar
MrPabloz:

Zdravím vím, že k tomu je dobrý vector, ale tím to dělat nechcu, spíš bych potřeboval poradit jak na dynamické pole objektů, tedy náhradu za vector, tedy něco ve smyslu :

Objekt **objekt;//nevím jak tohle inicializovat např na velikost 2, a poté zvětšovat pomocí realloc
//nebo nějak v tomhle smyslu
*objekt = new Objekt("a");//objekt 1
*objekt = new Objekt("b");//objekt 2
Odpovědět 10.1.2014 11:22
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
coells
Redaktor
Avatar
Odpovídá na MrPabloz
coells:

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;
}
 
Nahoru Odpovědět 10.1.2014 11:54
Avatar
MrPabloz
Člen
Avatar
Odpovídá na coells
MrPabloz:

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í" ?

Nahoru Odpovědět 10.1.2014 11:58
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
coells
Redaktor
Avatar
Odpovídá na MrPabloz
coells:

Urcite by slo pouzit realloc(), ale v tom pripade bych byl konzistentni a pouzival na to pole pouze malloc, free a realloc.

 
Nahoru Odpovědět 10.1.2014 12:02
Avatar
MrPabloz
Člen
Avatar
Odpovídá na coells
MrPabloz:

Jo takhle, už to chápu, sem si to spletl c C :( Děkuju moc za rady a vysvětlení teda :)

Nahoru Odpovědět 10.1.2014 12:03
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
MrPabloz
Člen
Avatar
MrPabloz:

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 :D

Editováno 10.1.2014 12:41
Nahoru Odpovědět 10.1.2014 12:39
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
MrPabloz
Člen
Avatar
MrPabloz:

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;
        }
Nahoru Odpovědět 10.1.2014 20:11
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
MrPabloz
Člen
Avatar
MrPabloz:

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;
}
Nahoru Odpovědět 11.1.2014 19:58
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
Odpovídá na MrPabloz
Lukáš Hruda (Luckin):

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.

 
Nahoru Odpovědět 12.1.2014 15:02
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na MrPabloz
Zdeněk Pavlátka:

realloc() se v takovém případě použít nedá, nezavolá totiž destruktory objektů. S objekty umí pracovat jen new a delete.

Nahoru Odpovědět 12.1.2014 15:14
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Odpovídá na Zdeněk Pavlátka
Lukáš Hruda (Luckin):

On by ale reallocoval pouze pole pointerů, na těch žádný destruktor volat nemusí.

 
Nahoru Odpovědět 12.1.2014 16:09
Avatar
Odpovídá na MrPabloz
Adam "Nero" Chudomel:

destruktory nedestruktory mě to funguje :D

Nahoru Odpovědět 12.1.2014 17:59
Nihil est, aut totum licet consistere
Avatar
MrPabloz
Člen
Avatar
MrPabloz:

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 ;)

Editováno 12.1.2014 19:10
Nahoru Odpovědět 12.1.2014 19:10
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
vitamin
Člen
Avatar
Odpovídá na MrPabloz
vitamin:

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.

 
Nahoru Odpovědět 12.1.2014 20:05
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.