Vill c++ kisHF

VC használatról:

sajnos ez a compiler (azon túl, hogy minden VS installációban más-más alapbeállítások vannak a project-ekhez) alaphelyzetben rendkívül sok, többnyire a szabvánnyal, és a józan ésszel szembemenő nyelvi kiterjesztést támogat, ami főként a kezdőket zavarja meg. Ezek nagy része egy mozdulattal kikapcsolható: /Za. A warningok megfelelő szintjéhez a /W4 és/vagy /Wall kapcsoló szükséges.

Kisházi gondolatok

Szokásos operátor viselkedés

A múlt heti házi specifikációjában szerepelt a következő mondat: "A szokásoshoz hasonló értelmű operátorok minden tekintetben viselkedjenek úgy, mint ahogy az alaptípusoknál megszoktuk."
Például a b=−a; kódról ugye senki nem gondolja, hogy a értékét megváltoztatná. Hasonlóképpen a c=a+b; használatakor sem változhat a (és b sem)!
Csak azon operátoroknál változhat az operandus, amelyek mellékhatással bírnak, és megváltoztatják az operandus értékét egyszerű típusok esetén is.
Ilyenek: =, az értékadással kombinált operátorok pl. +=, a pre- és post- ++ és −−, valamint c++-ban a beolvasó (és kiíró) operátorok.
Miután a szorgalmi >> operátorra eddig egyetlen megoldás érkezett, és ez még akár hasznos is lehet, itt egy üzembiztos megvalósítás (karakterenként olvasunk, és bővítjük a stringet):
std::istream& operator >> (std::istream& inp, Str& to)
{
        char c;
	Str dummy;  //egy ures string
	to=dummy;   // cel kiuritese, to="" is jo lenne!
	inp >> std::noskipws >> c; //ne hagyja ki a whitespace-eket
	           // enelkul a szokozok is eltunnek a szovegbol...
	while (c!='\n') //vagy barmi mas karakter, pl. ' ', '\t'
	{               // ha !isspace(c), akkor scanf viselkedes
	    to+=c;  //ha mar ennyit bajlodtunk vele...
	    inp >> c;
	}
	inp >> std::skipws; //opcionalis, a tovabbiakra
	return inp;
}

hívása:
Str s=...;
std::cin >> s;
Szükséges-e, hogy a beolvasó a Str osztállyal friend relációban legyen? Nem, mert NEM akarjuk elérni a Str objektum tagváltozóit, csak publikus (operátor)függvényeit hívjuk! Így aztán ez egy sima, osztályon kívüli (globális) függvény. (Egyébként így a kiíró operátorunk sem kell friend legyen, hisz van egy print(ostream&) tagfüggvényünk...)

Órai dolgok

Az órán a 8. aut-os konzervet oldottuk meg: közös ősosztályból származtattunk, majd heterogén kollekciót építettünk.

8. Házi feladat.

Tipikus ZH példa, érdemes önállóan leküzdeni a nehézségeket.
  1. Egy állatkertben háromféle medvét (Bear) tartanak: pandát (Panda), grizzlit (Grizzly) és barna medvét (BrownBear). Mindegyiknek különböző a napi tartási költsége, létezik egy változtatható alapegység statikus változó a Bear osztályban (basePrice=6.5), a panda tartása ennek konstansszorosa (pandaFactor=0.6), míg a grizzli esetében ez a tényező grizzlyFactor=2.2, a barna medvénél brownBearFactor=1.7. A programunk egy tömbben tartja az érkezett állatokat. Az egyes medve objektumok tartalmazzák az állatkertben eltöltött napok számát is. A célunk kiszámolni és kiírni az egyes medvék tartási költségét (getDailyCost(), getCost()) a kezelőszoftver által tárolt, nem változtatható elemeket tartalmazó tömbből.
    • Tervezzük meg és vázoljuk fel az osztályok öröklési hierarchiáját! Használjuk fel a fenti dőlt betűs osztály-, függvény- és változóneveket! Az osztályok téglalapjaiban tüntesse fel a költséggel kapcsolatos változó(k) és függvény(ek) deklarációját és láthatóságát!! Minden abban az osztályban tárolódjon, ahol logikus. Törekedjünk elegáns O-O megoldásokra! 
    • Implementáljuk az osztályokat és konstansokat a Zoo névtérben, figyelve arra, hogy esetlegesen egyes konstansokat is tagként vagy statikus tagként érdemes implementálni. Ne legyen egy függvénytörzsben sem felesleges, nem használt kód! Az osztályra nézve közös értékeket tilos több példányban tárolni. Egy új medvetípus esetleges felvételéhez ne kelljen a már meglévő osztályokat módosítani!
    • Írj egy egyszerű programrészletet egy (nem dinamikus) 6 elemű tömbbel, ami megmutatja három barna, két panda, és egy grizzli medve felvételét, valamint kiírja a fajtájukat, a napi és a teljes tartási költségüket.
    Beadandó egy zipben: a négy .h file, a tesztelő, és az öröklési hierarchia ábra svg, gif, tiff, png, pdf vagy ps formátumban.

További érdekes feladat gyakorláshoz

Az SVG (scalable vector graphics) egy szöveges fájlformátum, amellyel vektorgrafikus rajzok adhatók meg. Elterjedten használják weboldalakon. Egy SVG fájl a következőképpen néz ki:

 
<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg" version="1.1">
  <circle cx="100" cy="50" r="20" stroke="black" fill="yellow" />
  <line x1="100" y1="70" x2="100" y2="90" stroke="black" />
  <circle cx="90" cy="45" r="3" stroke="black" fill="blue" />
  <circle cx="110" cy="45" r="3" stroke="black" fill="blue" />
  <rect x="80" y="80" width="40" height="70" stroke="black" fill="blue" />
  <line x1="90" y1="150" x2="60" y2="190" stroke="black" />
  <line x1="110" y1="150" x2="140" y2="190" stroke="black" />
  <line x1="80" y1="90" x2="40" y2="70" stroke="black" />
  <line x1="120" y1="90" x2="160" y2="70" stroke="black" />
</svg>
 

Vagyis a kezdő svg és lezáró /svg között különféle formákat lehet megadni:

Láthatóan minden alakzat rendelkezik egy, a körvonal színét meghatározó tulajdonsággal (ez sztring), továbbá egy koordinátával (középpont, bal felső sarok, kezdőpont.) Az előbbit a fájlban mindig stroke-nak (ecsetvonás) hívják, az utóbbi viszont más-más neveken szerepel (cx,cy; x,y; x1,y1). A fenti kódból egyébként a jobb oldalon látható rajz keletkezik.

A feladat: írj heterogén kollekciót használó programot, amely eltárolja egy ilyen kép adatait! Valósítsd meg a kör, téglalap és szakasz osztályokat! A heterogén kollekció legyen kiírható egy SVG fájlba a következő kódrészlettel:

#include <fstream>                     /* std::ofstream-hez kell */

std::ofstream os("bluecoat_misi.svg"); /* fájl nyitása írásra */

os << "<svg width=\"200\" height=\"200\" "
   << "xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\">\n";
for (i=0; i<9; ++i)
  alakzat[i]->kiir(os);                /* os típusa is std::ostream */
os << "</svg>\n";

A keletkező SVG fájlt bármelyik modern böngészővel (Opera, Firefox, Chrome) meg tudod nyitni. (Ha szintaktikai hibás, és nem jeleníti meg, akkor pedig érdemes Notepad-del megvizsgálni.) Figyelj a kiíráskor az idézőjelekre; az idézőjel karaktert a sztring belsejében escape-elni kell: \", ahogy a fenti kódban is látható.