Diskuze: Pouzitie metody na ešte nevytvoreny objekt

C++ C a C++ Pouzitie metody na ešte nevytvoreny objekt

Avatar
rplsicik
Člen
Avatar
rplsicik:

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ý
Redaktor
Avatar
Odpovídá na rplsicik
Jan Vargovský:

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  +1 11.6.2015 19:10
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na rplsicik
Martin Dráb:

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:

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:

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
Redaktor
Avatar
Odpovídá na rplsicik
Martin Dráb:

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í
+1 bodů
Ř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.