NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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.

Aktivity
Avatar
rplsicik
Člen
Avatar
rplsicik:11.6.2015 18:36

Pokusim sa v skratke a vystižne:
"Pouzitie metody na ešte nevytvoreny objekt"
Ciže presne s tymto mam trampoty chapem bude to niečo cez ukazovatele ale ako na to?
Tak rozpišem teraz problem, potrebujem pomôct, poradit a naviest:

  • Mam vytvorenu triedu s ktorej ešte nemam vytvorene objekty
  • No potrebujem využit metodu vypisu (to mam zvladnute) tychto ešte neexistujucich objektov (sprevadza to chybova hlaška:

(error C2228: left.'vypis' must have class/struct/union)

Vopred velka vdaka za pomoc :)

 
Odpovědět
11.6.2015 18:36
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na rplsicik
Jan Vargovský:11.6.2015 19:10

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(...);
 
Nahoru Odpovědět
11.6.2015 19:10
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na rplsicik
Martin Dráb:11.6.2015 19:27

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_VI­OLATION. 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.

Nahoru Odpovědět
11.6.2015 19:27
2 + 2 = 5 for extremely large values of 2
Avatar
rplsicik
Člen
Avatar
rplsicik:12.6.2015 11:05

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.

 
Nahoru Odpovědět
12.6.2015 11:05
Avatar
martanec
Člen
Avatar
Odpovídá na rplsicik
martanec:12.6.2015 11:56

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.

 
Nahoru Odpovědět
12.6.2015 11:56
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na rplsicik
Martin Dráb:12.6.2015 12:02

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;
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
12.6.2015 12:02
2 + 2 = 5 for extremely large values of 2
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 6 zpráv z 6.