Problém s dědičností – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Problém s dědičností – C / C++ – Fórum – Programujte.comProblém s dědičností – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Blujacker
~ Moderátor
0
Grafoman
30. 3. 2011   #1
-
0
-

Ahoj,

programuji nyní v C++ šachy a narazil jsem na pár problému týkajících se objektů a dědičnosti. Mám objekt Figura, u kterého mám definované některé základní metody jako GetColor, GetPosition. Z této třídy potom dědí třídy Pěšec, Kůň, Královna, ... style



class Kun: public figura{
...
}


Hrací plochu potom implementuji pomocí dvojrozměrného pole 8x8:


Figury *** hraci_plocha = new Figura**[8];
for (i = 0; i != 8; i++){
hraci_plocha[i] = new Figura*[8];
}


Do tohoto pole potom ukládám jednotlivé figury, popř je označím jako prázdné políčko.


hraci_plocha[0][0] = GetVez(0,0, CERNA)


A nyní již k samotnému problému:

V grafickém rozhraní, když člověk klikne na některou figuru, tak se nejprve musí vypočítat, na které pole může daná figura skočit. U každé figury jsem proto implementoval metodu GetTahy(). Ale provedu následující kód, tak skončí chybou:


hraci_plocha[0][0].GetTahy();

, tak se metoda GetTahy hledá ve třídě Figura, místo ve třídě Vez.

Jasně, hraci_plocha je pole Figura, ale čekal bych, že když mi kompilátor dovolí tam uložit potomky třídy Figura, tak že s ním potom bude zacházet jako s potomkem a ne jako s Figurou.

Dá se tento problém nějak vyřešit, nebo je celý můj návrh špatný a měl bych to předělat..

Děkuji, Jakub

Nahlásit jako SPAM
IP: 84.42.166.–
Navštivte server Matematika pro každého
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
Reklama
Reklama
yaqwsx+9
Posthunter
30. 3. 2011   #2
-
0
-

Chtělo by to ukázku kódu, který obsahuje definici GetTahy. Kód co jsi poslal vypadá v pořádku.

K návrhu; já bych teda na problém šel jinak - na řešení, které modeluje situaci z jiného pohledu, ale to je otázka v kusu. Ale zaráží mě, co tě vede k používání tak složitého pole? Osobně bych to řešil jednudušeji:

Figury* hraci_pole[8][8]

Uchovával bych pouze pole ukazatelů - paměť pro jednotlivé třídy stejně alokuje (alespoň předpokládám) funkce GetVez. Máš větší jistotu, že se nespleteš.

Nahlásit jako SPAM
IP: 85.160.95.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
KIIV+42
God of flame
30. 3. 2011   #3
-
0
-

pokud dobre vidim tak se snazis pristupovat k metode ale mas tam jeste porad uzazatel...
vyvolani metody nad pointerem k objektu slouzi -> tj. hraci_plocha[0][0]->GetTahy();

mimo to, ja bych se na hraci plochu vykaslal a mel jen seznam figurek a jejich pozici.. hraci plocha je vzdy stejna a barva se da odvodit.. neco jako: ( x & 1 ) ^ ( y & 1 )

bude sice trosku pomalejsi najit kolize, ale to by byl problem az kdyz bys hledal vsechny moznosti (resp hraci pole se da klidne udelat jako pole integeru.. bitova maska napriklad 1pesak, 2vez, 4kun, 8strelec, 16dama, 32kral, 128 barva)

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
liborb
~ Redaktor
+18
Guru
31. 3. 2011   #4
-
0
-

Přidám svojí trošku do diskuze. Tohle je klasická polymorfní struktura, učebnicový příklad. Funkci GetTahy definuj v třídě Figura ja virtuální nebo ještě lépe jako čistě virtuální. V dceřiných třídách ji už implementovanou máš, takže ti bude stačit ji označit jako virtuální.

Nahlásit jako SPAM
IP: 78.80.52.–
Blujacker
~ Moderátor
0
Grafoman
31. 3. 2011   #5
-
0
-

Děkuji všem, problém vyřešen :-)

To yaqwsx : Pravda :-)

To KIIV : Já jsem ten kód nekopíroval, psal jsem ho tady na fóru a z pythonu jsem zvyklý na to, že se členské metody volají Třída.metoda() a tak mi občas napsání -> dělá potíže

To liborb : Tohle fungovalo bezvadně. Musel jsem metodu Figra::GetTahy definovat jako čistě virtuální, což způsobilo jinde v kódu pár problému, ale nyní už to šlape jako hodinky...

Nahlásit jako SPAM
IP: 84.42.166.–
Navštivte server Matematika pro každého
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 90 hostů

Podobná vlákna

Problém s VC++ — založil beb

Problém s $this — založil Marty

Problem s VS C# — založil Mrakoplas

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý