Típusmegvalósítás


A standard C++ programozási nyelv a C –ből átvett és némileg módosított összetett adatszerkezetek definiálását teszi lehetővé.

Typedef

Egy meglévő típusból származtatott típus, mely örökli az szülő minden tulajdonságát, beleértve a típusműveleteket is. Gyakorlatilag egy átnevezett másolat.

Használata:       typedef szülőtípus új_típus_neve;

Példa:                 typedef unsigned char octet;

Enum

Speciális, típusfüggetlen felsorolási típus. A felsorolás minden eleme megfeleltethető egy természetes számnak, így értelmezhető az elemein egy egyszerű részbenrendezés.

Használata:       enum típusnév {elem1, elem2, …};

Példa:                 enum evszakok {tavaz, nyar, osz, tel};

Itt a tavaszhoz a 0-ás sorszám tartozik, a nyárhoz  az 1-es és így tovább. Hagyományos ’C’ módszerekkel ez a következőképpen implementálható:

#define tavasz      0

#define nyar         1

#define osz           2

#define tel             3

Union

A union –nal definiált típus különböző adattípusok együttes tárolására szolgáló adatszerkezet. Az adattagjaira külön-külön hivatkozhatunk, alapértelmezésben public elérésűek, tehát a struct –hoz hasonló adatforma. Van azonban egy nagyon fontos funkcionális különbség: minden adattagja a ugyanazon a memóriacímen helyezkedik el. A program deklarációkor statikusan lefoglalja az adatok helyét a memóriában. A közös címzés eredménye, hogy különböző adattagok értékadása a többi adattagra is hatással van, ezért a gyakorlatban ritkán használt, csak specifikus problémák megoldásához használt adatszerkezet.

Használata:       union típusnév {típus1 változó1; típus2 változó2 …};

Példa:                 union plreg{struct{char al,ah;} b; int w;}axreg;

Ebben a példában létrehoztuk egy „plreg” típusú „axreg” nevű 16 bites regiszter modelljét, amelynek alsó és felső 8 bitjére külön is hivatkozhatunk. Például a következő utasítássorozat eredménye pontosan ugyanazt az eredményt produkálja a memóriában, mint ez: axreg.w=0xFFFF;

axreg.b.al=0xFF;

axreg b.ah=0xFF;

Struct

A struct, a class és a union nagyon hasonlóak egymáshoz. Az előbbi union –tól abban különbözik a struct, hogy külön címzése van minden adattagjának és a típushoz saját metódusokat definiálhatunk, beleértve a konstruktort és a destruktort is. A union –hoz hasonlóan alapértelmezésben minden adattagja és metódusa public. A class –tól csak alapértelmezett láthatóság szempontjából tekinthetjük különbözőnek, egymásnak megfeleltethetőek. A struct a C nyelv, a class pedig a C++ nyelv preferált struktúrája.

Használata:       struct típusnév {típus1 változó1; típus2 változó2 …; metódusdef 1, metódusdef 2; …};

Példa:                 struct ember {string nev; private: int kor; public: ember(string n, int k){nev=n; kor=k;};};

Az előbbi példában létrehoztunk egy olyan „ember” nevű adatszerkezetet, amely két attribútumból áll, a nev (string) –ből és a kor (int) –ből, melyek közül az első alapértelmezésben public, a második pedig private. Ezen kívül definiáltunk egy konstruktort (ha ezt nem tesszük meg, akkor az attribútumok alapértelmezett konstruktorai hívódnak meg). A következő kódrészlet a fent definiált struct –nak létrehozza egy példányát és megváltoztatja a nevét!

ember emb(„Lajos”,20);

emb.nev=”Anna”;

Nem hivatkozhatnék a kor attribútumra, mivel az private elérésű, tehát annak nem módosíthattam volna, sőt, le sem kérdezhettem volna az értékét!

Class

A C++ szabványos, preferált és legjobban támogatott típusmegvalósító eszköze. A struct –tól csupán láthatóság szempontjából nevezhető különbözőnek: alapértelmezésben minden adattagja és metódusa private. Ez megfelel az objektumelvű programozás azon alapelvének, hogy rejtve legyen a konkrét típusreprezentáció és a típus a típusműveletein keresztül legyen elérhető.

Használata:       class osztálynév {típus1 változó1; típus2 változó2 …; metódusdef 1, metódusdef 2; …};

Példa:                 class ember {string nev; int kor; public: ember(string n, int k){nev=n; kor=k;}; public: void set_Nev(string n){nev=n;};};

Ez a példa a struct –nál látott példa megfeleltetése osztályokra. A különbség az, hogy most az alapértelmezett láthatósága az adattagoknak private, tehát az ember osztály konkrét típusreprezentációja rejtve van. Az osztályt a public metódusain (típusműveleteken) keresztül érjük el. Így a struct –nál látott módon most nem változtathatjuk meg közvetlenül a példány nevét, ahhoz public: string nev; -vel kellett volna deklarálnunk azt. Viszont van erre megfelelő típusműveletünk, tehát a következő kódrészlet megfelelő:

ember emb(„Lajos”,20);

emb.set_Nev(”Anna”);

Természetesen ezt a módszert is alkalmazhattuk volna a struct esetében és viszont, hiszen a kettő egymásnak megfeleltethető.

Végszó

Természetesen ez csak egy rövid bevezető, egy egyszerű ízelítő a standard C++ -ban használatos típusmegvalósító programozói eszközökről. Részletesebb leírások, szintaxisok, valamint példák bőségesen fellelhetőek az Interneten, elsősorban angol, de sok site –on magyar nyelven is. Mivel az objektumorientált programozás modularizációs elvének alapvető építőköveit reprezentálják, aki C++ -szal, vagy egyéb OO programozási nyelvvel kíván komolyabban foglalkozni, annak mindenképpen ajánlom figyelmébe az itt felsoroltak, elsősorban az osztályok alaposabb tanulmányozását!

Az itt található írás !!!nem ellenőrzött anyag!!!, az ELTE elsőéves programtervező matematikus és programtervező informatikus hallgatók oktatási segédanyaga az elemi alkalmazások fejlesztése, ill. alkalmazások fejlesztése c. tárgyakhoz.
Írta: Kátai Kornél, dr. Gregorics Tibor írásai alapján
Budapest, 2006