Návrh třídy
může probíhat například takto
Promyslete si, co by měla třída fakticky dělat a co po ní ve finále budete chtít.
Například projekt: navrhněte třídu pro manipulaci s lineárním seznamem (seznam obsahuje položky hodnota a index). Umožněte vkládání a odstraňování jednotlivých prvků, nebo celých seznamů, třídění podle velikosti (hodnoty nebo indexu), přiřazování seznamů, srovnání položek … Ve druhé fázi umožněte, aby prvky v seznamu mohly být libovolné – například obsahovat hodnoty různých typů. Pro inspiraci. Můžete použít například jako balíček karet a implementovat míchání, rozdávání, jednoduchou hru (válku, oko, prší ...)
Nebo projekt pro realizace grafického elementu, který umožní vykreslení objektů na obrazovce, vytváření těchto objektů, rušení objektů, přiřazování objektů... Začněte jedním grafický elementem: bodem nebo úsečkou, v konečné fázi zkuste kombinovat (společně smíchat) různé typy grafických objektů – pro jejich držení můžete použít například 1D pole nebo seznam. Můžet použít jako příklad nějaký pohyb bodů po obrazovce (variace na screen saver …) například podle stisknuté klávesy, náhodných čísel ...
Nebo si vytvořte váš vlastní projekt.
Promyslete si kategorie – vznik, zánik, nastavení a zjištění hodnot, manipulace (činnost), operátory, konverze, vstup a výstup, dynamické proměnné, dědění
U dědění je důležité rozhodnout zda prvek je rozšířením původního, nebo ho obsahuje. Například u grafického elementu je lépe volit, že úsečka obsahuje bod, než že z něj dědí. Jako základ dědění je vhodné uvádět společnou funkčnost a navrhnout tak zvané rozhraní. Metody rozhraní volíme jako virtuální, což nám následně umožní pracovat se zděděnými objekty přes jejich společnou část rozhraní (definovanou přes bázovou třídu). I když zde pracujeme s bázovou třídou, díky mechanizmu virtuálních metod máme k dispozici metody třídy zděděné, které samozřejmě ví o jaký prvek se jedná a dokáží zavolat mu příslušnou metodu.Prvky různých typů zděděných od báze se například mohou vložit do pole ukazatelů na bázový typ a potom se prochází jednotně přes metody rozhraní bez znalosti konkrétního typu (ten si zjišťuje program za chodu z tabulky virtuálních metod – metoda je volána přes adresu, kterou si objekt nese v sobě). Můžeme tak například stejným postupem vykreslit kružnici, čtverec … i když je jasné, že kreslící metoda i datová reprezentace je odlišná.
Například pro grafický element by mohlo rozhraní obsahovat tyto metody: Vykresli – pro vykreslení všech prvků, Rotuj – pro zrotování pozic všech objektů vůči zadanému středu otáčení, Posuň – pro posunutí všech prvků, VratVzdalenost – pro zjištění minimální vzdálenosti objektu od zadané pozice …
Například pro lineární seznam by se vytvořil společný prvek který by byl prvkem seznamu a měl základní metody. Pokud by z tohoto základního prvku dědila i třída pro práci se seznamem, choval by se seznam i jako prvek.
Promyslete si datovou reprezentaci a její návaznost na bod 2)
V případě dědění provádějte následující body od bázové třídy
vytvořte hlavičkové a zdrojové moduly tříd. Vytvořte modul pro testování tříd. Hlavičkový soubor standardně ošetřete. Zvažte použití vlastního jmenného prostoru.
Vytvořte datové členy třídy
Vytvořte konstruktory a
destruktory (pomocí trasování sledujte postup
volání zde i dále. Zde i u metod můžete
postupovat po krocích tak, že napíšete prázdné
tělíčko, vyzkoušíte zda je v pořádku
voláno, potom rozhodnete zda to bude inline, nebo ve zdrojové
části a následně doplníte vlastní kód.
Pro předávání používejte pokud možno
konstantní parametry. Metody neměnící prvek
označte jako konstantní.
U konstruktorů a destruktorů je
možné jako kontrolní mechanizmus implementovat
počítání vzniklých (konstruktor
inkrementuje) a zaniklých (destruktor dekrementuje) objektů
pomocí statických objektů. Pokud je po skončení
programu počet aktivních proměnných různý od
nuly je někde chyba. Pro tisk statických proměnných se
používají statické metody.)
Pro testování například tato část
kodu
{ int i=0; pomocná proměnná
{
TT p1, p2
= 3, p3 = p2, p4(p3), p5 (“12, 14“), p6 = 3.1, p7
(1,2);
}
i = 5; zde už by neměl „žít“
žádný objekt třídy
}
Vytvořte metody pro zadávání a čtení dat
Pro testování například tato část
kodu
p1.Set(4); p2.SetX(5); p3.Set(3,8); i = p4.GetX(); ii =
p5.Get(4,3);
ověřte, že nefunguje přístup ke členským
datům třídy: aa = p1.proměnná; musí dát
chybu
Vytvořte metody pro výpočty (manipulaci)
Například pro vázaný seznam:
vložení prvku, seřazení podle daného kriteria,
načtení prvku, zařazení prvku, vložení seznamu,
tisk, rušení prvku, zjištění počtu
prvků, volného indexu, maximálního indexu …
,
Například pro grafiku – zadání
souřadnic, zjištění minimální a
maximální hodnoty souřadnice, rotace, translace,
určení zda je na obrazovce (ve vybraném regionu),
vyhledání nejbližšího elementu k
určenému bodu, vykreslení …)
Pro testování například tato část
kodu
p1.Vypocti(); p2.Srovnej(p1);
p5.Pridej(p1,p2,65);
p2.Uprav();
p3.Invertuj(); invertuje p3, p3 je
změněná
p4.Srovnej(Invertuj(p3)) ; srovná s
invertovaným prvkem, ale prvek p3 se nezmění
Například pro lineární seznam:
připojení seznamu pomocí + (a+b), vytvoření
seznamu s „otočením“ znamének hodnot v
seznamu pomocí - (-a s
tím, že respektuje stejná pravidla jako základní
typy (int, float) a tedy a je i po operaci stejné jako
před ní), ukázat rozdíl oproti + (+a),
přiřazení = (a=b), test na shodu seznamu == (a==b),
zjištění zda obsahuje hodnotu (a== 34) …
Nebo
u grafiky: přiřazení = (a=b), pro „zrcadlení“
prvku - (-a), ukažte rozdíl s + (+a), výpočet
„průměru“ dvou bodů a = (b+c)/2; násobení
konstantou pro zvětšení/zmenšení a =
b *2; a *= 2; přičtení konstanty pro posuv, zjištění
zda dva body jsou totožné a==b …
Pro testování například tato část
kodu
p1 = p2 = -p3 + p4 * p5;
if (p1 <= p2) p1 -= +p5 * 8;
else p1 -= 3*p4;
float f = p1 != p3;
int i = (int)p5;
Vytvořte funkce/metody pro vstup a výstup
Tyto metody by měly být doplňkové. To znamená, že alespoň jeden z typů vstupu by měl být schopen načíst data pořízená výstupem.
Pro testování například tato část
kodu
{cout << “ ted si vypisu hodnoty me tridy “
<< p1 << “ a pro srovnani “ << p2 <<
“\n zadejte hodnoty noveho prvku“;
cin >>
p5;
ifstream is(„nacti.dat“,ios::in); is >> p4;
}
Konec
Poslední úpravy 2007-09-19