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.


Zobrazeno 6 zpráv z 6.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
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.