Diskuze: Kontajnery a vkladanie objektov

C++ C a C++ Kontajnery a vkladanie objektov

Avatar
rplsicik
Člen
Avatar
rplsicik:

Zdravim
Nedalo mi sa nezamysliet nad jednou preblematikou a tou je:
Daju sa vkladat objekty jednej triedy do nejakeho kontajneru?
Vkladanie rôznych dátovych typov do kontajnera je samozrejmost ale čo takto vytvoreny 'n' počet objektov umiestnenych do kontajnera?

 
Odpovědět 1.6.2015 16:57
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na rplsicik
Martin Dráb:

Vkládat objekty jednoho typu do jednoho kontejneru možné samozřejmě je. Například si vytvoříš std::vector<T>, do nějž pak můžeš vkládat objekty typu T.

Případně je možné vkládat do jednoho kontejneru objekty více typů, které ale mají společného předka. Pak ale asi sázneš po kontejneru odkazů/referencí, aby stále fungoval polymorfismus.

Pokud vím, v normě není nic o tom, že má jít vkládat objekty úplně různých typů do jednoho kontejneru. Ne že by to nešlo naprogramovat.

Ale myslím, že ses ptal na něco jiného a že jsem tvoji otázku nepochopil. Kdyžtak ji zkus nějak názorněji zformulovat.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 1.6.2015 18:45
2 + 2 = 5 for extremely large values of 2
Avatar
rplsicik
Člen
Avatar
rplsicik:

Vdaka to bolo presne to čo som potreboval vediet. No zabrzdil som na probleme a tým je "typ objektu"
Mam totižto vytvorenu triedu uživatel (jej parametre su meno,heslo) cez nu vytvaram objekt ktory chcem umiestnit do kontajnera a problem je vtom že neviem akeho typu mam vytvorit ten kontajner.

 
Nahoru Odpovědět 3.6.2015 12:02
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na rplsicik
Martin Dráb:

Pokud objekt, který chceš do kontejneru vkládat, je typu CMujObjekt, tak máš v zásadě dvě možnosti. Dejme tomu, že kontejnerem, do kterého ty objekty chceš vkládat, je vector.

  1. std::vector<CMu­jObjekt> – v při vkládání do kontejneru se do něj objekt okopíruje (případně přesune, pokud budeš chtít, nebo pro to "budou vhodné podmínky"). K jednotlivým objektům můžeš normálně přistupovat a volat jejich metody. Nejsem si ale jistý, zda ti bude funovat polymorfismus a podobné věci.
  2. std::vector<CMu­jObjekt *> – do kontejneru budeš vlastně ukládat jen odkazy (adresy) daných objektů. Přes tyto odkazy na ty objekty pak také budeš přistupovat. Ojbkety si ale musíš alokovat sám (a dealokovat). Na objektech ti bude fungovat polymorfismus a podobné vymoženosti (do kontejneru můžeš strkat i potomky CMujObjekt).

Jsou i další možnosti, jak toto řešit (ten syrový pointer v (2) se asi moc líbit nebude), ale myslím, že pro tebe asi nemá smysl zacházet do větších detailů. Pokud prostě potřebuješ objekty jednoho typu někam uložit a nepotřebuješ je sdílet, tak zvol možnost (1).

Nahoru Odpovědět  +1 3.6.2015 12:24
2 + 2 = 5 for extremely large values of 2
Avatar
rplsicik
Člen
Avatar
rplsicik:

Super vdaka 1. riešenie funguje presne podla požiadaviek :) Obrovska vdaka.
Momentalne sa trapim už len z problemom kedy mi program preskoči prikaz getline() ale to už je mimo témy.

 
Nahoru Odpovědět 3.6.2015 14:17
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 5 zpráv z 5.