Diskuze: Pouzitie metody na ešte nevytvoreny objekt
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 6 zpráv z 6.
//= 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.
Jakým způsobem chceš vypisovat objekt, který není inicializovaný? Jakou informaci bys chtěl z něj získat? Jediné co mě napadá, je použít classu v roli objektu, s tím, že máš nějakou večejnou statickou metodu. Pak jí můžeš zavolat skrz:
ClassName::MethodName(...);
Pokud chceš volat "metodu na neexistujícím objektu", tak to lze simulovat statickou (ona pak jedna instance vlastně existuje, dalo by se říci, ale lze přistupovat pouze ke statickým členům).
Ono by asi čistě teoreticky šlo v nějakém jazyku volat metody ještě neexistujícího objektu, ale to hodně záleží na implementaci těchto pojmů do daného jazyka. Rozhodně to nebude fungovat na virtuální metody a nebude se v rámci metody možné odkazovat na objekt, na kterém je volána (nepůjde použít this).
Ale dost pochybuju, že by to v C++ bylo reálně možné. Jinak metodu na neexistujícím objektu zavolat "samozřejmě můžeš":
CMojeTrida *mujObjekt;
mujObjekt->MojeMetoda(...);
Možná to projde, pokud mujOjbket namíříš na adresu, přístup na kteoru nevyvolá výjmku STATUS_ACCESS_VIOLATION. Ale i tak pochybuju, že to projde se vždy definovaným výsledkem.
Netřeba asi mluvit o tom, jak dobrá je to programátorská technika.
Možná bude lepší, když se manpíšeš, jakého cíle potřebuješ dosáhnout.
Takže ide o toto:
Mám vytvorene funkcie ktore mam definovane mimo main()
Sú to:
TvorbaHracov --->
void TvorbaHracov()
{
///Tvorba hracov
string m;
cout << "Zadaj meno 1.hraca" << endl;
getline(cin, m);
Fighter bojovnik1 = Fighter(m);
cout << "Zadaj meno 2.hraca" << endl;
getline(cin, m);
Fighter bojovnik2 = Fighter(m);
}
Ktora je volana v pripade vybratia si určitej položky v menu.
V určitej situacii behu programu je volany vypis hodnôt, objektov bojovnik1 a
bojovnik2. <--- a v tomto vznika problem volam niečo čo neexistuje, môžem
nejaky sposobom alokovat priestok kde budu niekedy v buducnosti uložené tieto
objekty.
nemozes zavolat metodu objektu, ktory este neexistuje. Pokial sa nejedna o staticku metodu.(to uz bolo povedane vyssie)
Mozne riesenie je, ze pred vypisom hodnot si skontrolujes, ci uz objekt bol vytvoreny. Ak nie, tak ho vytvor, alebo preskoc volania metod objektov bojovnik1 a bojovnik2.
btw, v metode TvorbaHracov() objekty bojovnik1 a bojovnik2 su len lokalne premenne. Pokial s nimi chces pracovat aj mimo metody, treba to prerobit.
No, ty ty bojovníky tvoříš jako lokální proměnné v té proceduře Tvorbahracov, takže při jejím skončení vesele zaniknou. Pokud ti stačí držet si informace o dvou bojovníkách, udělej si na to globální proměnné a jdi na to přes ukazatele. V rámci procedury Tvorbahracov dynamicky vytvoříš instance třídy Fighter a přiřadíš je do příslušných globálních proměnných.
Zároveň snadno poznáš, zda-li globální proměnné obsahují platnou instanci. V takovém případě mají hodnotu různou od 0.
...
Fighter *bojovnik1 = 0;
Fighter *bojovnik2 = 0;
...
void TvorbaHracov()
{
///Tvorba hracov
string m;
cout << "Zadaj meno 1.hraca" << endl;
getline(cin, m);
bojovnik1 = new Fighter(m);
cout << "Zadaj meno 2.hraca" << endl;
getline(cin, m);
bojovnik2 = new Fighter(m);
}
V závěru programu je slušné oba bojovníky smazat.
delete bojovnik1;
delete bojovnik2;
Zobrazeno 6 zpráv z 6.