Pomozte s programem v C++...
Zdravím,
potřebuju tuhle: http://java.sun.com/j2se/1.4.2/docs/api/java/util/A rrayList.html třídu pro C++, asi by nebyl problém si něco takového napsat, ale raději se zeptám jesti už něco takového neexistuje, abych si ušetřil psaní... Nemusí to být úplně stejné alespoň principiálně. Řeším příklad Malý vysokoškolský studijní systém. Rozvrhl jsem si to nějak takto:
1. třída: Osoba
2. třídy: Zaměstnanec, Student - dědí z třídy Osoba
3. třída: Doktorand - dědí z třídy Zaměstnanec i Student (doktorand je v podstatě i zaměstnanec, dostává plat)
4. třída: Zkouška
5. třídy: SeznamStudentů, SeznamZaměstnanců, SeznamZkoušek, SeznamDoktorandů - dětí z třídy ArrayList, a doplním pouze metody, jako např. najdiStudenta(int id), tiskSeznamu() apod.
Každý student a doktorand bude mít privatní atribut kolekci (ArrayList) zkoušek na které se zapsal.
PS: Snad jsem to napsal srozumitelně. Jedná se o projekt k zápočtu z C++... Budu vděčný za každé připomínky k mojí úvaze... Má někdo podobnou třídu, jako je zmiňovaný Javovský ArrayList pro C++ (měla by to být třída, která je Template)?
Díky!
MaSo
Pozri si triedu std::list<T> z STL.
To bude zřejmě ono, díky. Nějak jsem ale nepochopil, jak to dostanu to toho svého programu... Používám DevCpp.
Neviem, aký s tým máš problém. Toto ti ide skompilovať?
Jsem dneska nějaký pomalejší, ano jde to. Nějak jsem žil v přesvědčení, že si musím někde stáhnout zdrojak toho listu a přidat si ho do svého projektu. Ještě jednou díky!
Spravil by som to tak, že zoznam študentov, zamestnancov a pod. by som mal v std::list a vyhľadávacie funkcie by boli statické metódy tých tried, aby som sa vyhol dedeniu zo std::list. Čiže by si napr. študenta s nejakým identifikátorom našiel pomocou takejto funkcie:
Prípadne by si mohol použiť hešovaciu tabuľku (std::map<int, Student*>).
Díky. A můžu se zeptat proč se chceš vyhnout dědění z Listu? Řešil jsem podobný příklad v Javě a dělal jsem to právě tím děděním z Listu (ArrayListu). Neměl jsem žádný problém...
List v C++ nebol navrhnutý na to, aby sa z neho dedilo. Nemá napr. ani virtuálny deštruktor. Ak chceš pristupovať k listu, tak nie pomocou dedenia, ale pomocou zapúzdrenia.
Jak udělat v C++ aby metoda vracela odkaz na null? Mám toto:
Když se student nenajde, tak chci vrátit null. Ví někdo, jak na to?
null je 0 resp. presnejsie povedane tusim (void*)0
Delphi ma mozno nil, resp. ma vobec Delphi pointre? Ak nema tak nemozes vracat null.
Ty voe... Kde si vzal Delphi? Ja se ptam na C++! (Void*)0 jsem nasel googlem, nefachci... To C++ je nějaké divné, to co, jde v Javě na dva řádky, aby tam (v C++) člověk psal v Assembleru...
Napadly mě HCéčka, jako vracet nějakého fake Studenta, který má id třeba -99, ale to se mi zdá velmi amatérské... Takový program, by byl fakt přátelský na paměť, kbyby při každém vyhledávaní vytvářel nové objekty...... Co kdyby, se vyhledávalo třeba milionkrát...
Null myšleno jako odkaz na nic...
Jaj o Delphi bol dotaz vedla
ked to je C++ tak mas normalne zadefinovane NULL, ale ta fcia nevracia smernik, tak ako tam chces mat NULL. Uz to pisal asi aj los nizsie (este som to necital).
NULL je ukazovateľ, zatiaľ čo tvoja funkcia má vrátiť inštanciu triedy Student a nie ukazovateľ na inštanciu.
Riešení je viacero:
1. Použiť namiesto triedy std::list triedu std::map, ktorá má funkciu pre hľadanie podľa kľúča.
2. Prerobiť zoznam študentov tak, aby obsahoval ukazovatele. V prípade neúspechu sa vráti NULL.
3. Zmeniť vyhľadávaciu funkciu tak, aby vrátila iterátor. V prípade neúspechu sa vráti studenti.end().
4. Použiť vzor Null Object. V prípade neúspechu sa vráti nejaká dohodnutá inštancia, reprezentujúca žiadneho študenta.
Edit: Asi si už na to prišiel, ale pre istotu: Ak máš kontajner (std::list, std::map, ...), do ktorého vkladáš priamo inštancie nejakej triedy a nie ukazovatele, tak tá trieda musí implementovať minimálne kopírovací konštruktor, aby to vôbec fungovalo.
Díky, za obsáhlou odpověď.
Když to předělám na ukazatele, budu moc při procházení seznamem volat metody? Např.:
Nějak mi taky neleze do hlavy jak ten seznam zadefinovat, aby obsahoval pointery... Zřejmě takto:
Ale jak pak udělat metodu přidej studenta? Teď to mám takhle:
Tohle se mi zamlouvá... viz: http://blog.vyvojar.cz/lazo/archive/2005/06/20/6177 .aspx
Keď to prerobíš na ukazovatele, budeš musieť k vlastnostiam a metódam objektu pristupovať cez operátor -> namiesto obyčajnej bodky. Takže ten kód bude vyzerať nejako takto:
A ďalej:
Použitie:
Študentov potom samozrejme treba niekedy uvoľniť z pamäte.
Použitiu Null objektu by som sa vyhol, ak na to nemáš nejaký pádny dôvod (.šámeN).
Losi, díky moc! Nevím, co bych si bez tebe počal... Předělal jsem to teda tak, aby seznamy obsalovaly pointery, ale ještě se mi nepodařilo zprovoznit odebrání studenta ze seznamu na základě jeho id...
Napadly mě dvě varianty, bohužel ani jedna mi nepracuje...
1.
2.
Program jde normálně zkompilovat, ale když se pokusím zavolat metodu na odebrání, končím na Windows hlášce, že program provedl neplatnou operaci...
PS: V metodách ještě nemám zohledněné co dělat když se student s daným id nenajde... To dodělám, až mi to bude chodit aspoň takhle.
PSS:
Medota najdiStudenta(int id) mi jede, nedalo by se ji nějak využit při odebíraní?
Javě by to šlo napsat třeba takto:
Po tom ako odstrániš študenta zo zoznamu, nemôžeš ďalej zvyšovať iterátor, takže tam musíš dať break. Debugger by ti mal ukázať presne, kedy to spadne.
Tak hlavně díky tobě, jsem program dokončil. Zítra (vlastně už dneska ) ho předvedu u zkoušky, snad to dopadne dobře. Ještě jednou díky moc.
Tak program se líbil, ale u zkoušky jsem trochu domotal včasnou a pozdní vazbu, takže nakonec za dvě...