Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

LA C++ programozási nyelv Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 19./0. lRokonok, barátok lÚj műveletek hozzárendelése az.

Hasonló előadás


Az előadások a következő témára: "LA C++ programozási nyelv Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 19./0. lRokonok, barátok lÚj műveletek hozzárendelése az."— Előadás másolata:

1 lA C++ programozási nyelv Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 19./0. lRokonok, barátok lÚj műveletek hozzárendelése az operátorokhoz Rokonok, barátok. Operátorok átdefiniálása lObjektumok dinamikus létrehozása

2 Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 19./1. lObjektumok dinamikus létrehozása Az objektumok program futás közbeni létrehozása azzal az előnnyel jár, hogy a menetközben meghatározott értékektől függő paraméterezéssel, ill. darabszámban hozhatjuk létre az objektumokat. Az értékek származhatnak a felhasználótól is. A dinamikusan létrehozott objektumok a Heap memóriában jönnek létre és addig léteznek, amíg a programnak szüksége van rájuk. Megszüntetésüket és ezáltal a memória felszabadítását is a program végzi. Az objektumok dinamikus létrehozását is a new, megszüntetésüket a delete operátorral végezzük. Az ilyen módon létrehozott objektumoknál szintén meghívásra kerül a konstruktor és megszűnésükkor a destruktor. Példa: Egyetlen objektum és objektumvektor dinamikus létrehozása Lista * listamut, * dinamlistak; // mutatók definiálása az első lépés listamut = new Lista(12); // egyetlen listaobjektum 12 elemű belső vektorral dinamlistak = new Lista[ 3 ] ; // három listaobjektumot tartalmazó vektor // objektumvektor létrehozásakor nem adhatjuk meg az elemszámokat // az objektumok használata zajlik itt delete listamut; delete [ ] dinamlisták; // Milyen kényelmes, hogy a konstruktorok és a destruktorok végzik a belső nevek vektor // dinamikus létrehozását és törlését!

3 Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 19./2. lRokonok, barátok A C++ nyelvben az azonos őstől származtatott objektumok egymás rokonai. Az adatrejtés ezek között gyengébb a teljesen idegen objektumok adattagjainak és nem publikus tagfüggvényeinek elérhetetlenségéhez képest. Adódhatnak azonban ritkán olyan esetek, amikor egyes függvényeknek több osztály adattagjához is van kötődése. Ilyen esetekben a friend (barát) jelzéssel felvéve a függvényt a barát osztályba lehetővé tesszük számára a privát adattagokhoz és privát tagfüggvényekhez való hozzáférést. A függvény eredetileg lehet valamelyik osztály tagfüggvénye és ily módon egy másik osztályhoz is hozzáférhet, vagy lehet az osztályokon kívül álló, de a barátként befogadó osztályok adataihoz ily módon hozzáférő. Nézzünk egy példát az utóbbi esetre! Tárolja a korábban megismert Lista típusú objektumunk hallgatók egy csoportjának a nevét. Egy másik, új osztályba tartozó objektum tárolja egy adott időszakban tanulmányi emlékérmet kapott hallgatók nevét és érmének színét! Ugyanaz a hallgató többször is szerepelhet benne. Szeretnénk meghatározni, hogy az első csoportba tartozó hallgatók összesen hány arany érmet szereztek. Érezhetően a választ megadó függvény nem köthető szorosan egyik osztályhoz sem. A megoldáshoz az első csoport minden tagjára meg kell nézni, van-e vele egyező nevű az érmet szerzettek között, ha van és arany érmet kapott, figyelembe kell venni a számlálásban.

4 Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 19./3. Az alábbiak a korábban adott osztályhierarchia kiegészítéseként értendőek és csak az új részeket mutatják. #define DSZ 50 // dijazott hallgatók száma, az egyszerűség kedvéért itt megadva enum eremtip { arany, ezust, bronz }; … class Dijazottak; // előrehivatkozás a Dijazottak osztályra, hogy hivatkozhassunk rá … class Lista {… public: friend int AranyermekSzama(Lista& lista, Dijazottak& dijazottak); // referencia paramétereket használunk a vektorok másolásának // elkerülésére... }; // folytatódik

5 Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 19./4. class Dijazottak; { private: nevtip dijazottvekt [DSZ]; // egyszerűség kedvéért adott méretű eremtip eremvekt[DSZ]; public: void DijMegadasa(int i, nevtip nevbe, eremtip erembe) {strcpy(dijazottvekt [ i ], nevbe); eremvekt [ i ]= erembe; } void DijLekerdezese(int i, nevtip nevki, eremtip& eremki ) { strcpy(nevki, dijazottvekt [ i ] ); eremki = eremvekt [ i ]; } friend int AranyermekSzama(Lista& lista, Dijazottak& dijazottak); }; int AranyermekSzama(Lista& lista, Dijazottak& dijazottak) { int db=0; for (int i =0; i<lista.elemszam; i++) // közvetlen adattagelérés! for ( int j =0; j<DSZ; j++) { if (!strcmp(dijazottak.dijazottvekt[ j ], lista.nevek[ i ]) && dijazottak.eremvekt[ j ]==arany) db++; // közvetlen adattagelérés! } return db; } //folytatódik

6 Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 19./5. … Lista lista(40); Dijazottak dijazottak; void main(void) { … // feltöltés: lista nevtip nevbe; eremtip erembe; for (int m=0; m<lista.Elemszama(); m++) { printf("\nA %d. hallgató neve: ", m); gets(nevbe); lista.ElemMegadasa(m, nevbe); } // feltöltés: dijazottak for (m=0; m<DSZ; m++) { printf("\nA %d. dijazott hallgato neve: ", m); scanf("%s", nevbe); printf("\nA %d. dijazott hallgato érme (0,1,2): ", m); // egyszerűség kedvéért.. scanf("%d",&erembe); dijazottak.DijMegadasa(m, nevbe, erembe); } printf("A listán szereplők %d aranyermet szereztek. ", AranyermekSzama(lista, dijazottak) ); // a függvény hívása }...

7 Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 19./6. lOsztály tagfüggvényének hozzáférése más osztály privát részéhez Ezt az esetet az alábbi vázlattal szemléltetjük: class A { … void fvA( );... }; class B { private: … public: void fvB( ); friend void A:: fvA(); // használhatja B privát tagjait … }; Végül megjegyezzük, hogy ha egy osztály (pl. A) több tagfüggvénye számára szeretnénk egyszerre engedélyezni egy másik (pl. B) privát tagjainak a közvetlen elérését, akkor az egyes függvények helyett B magát az A osztályt fogadhatja barátjának.

8 Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 19./7. lÚj műveletek hozzárendelése az operátorokhoz A valós világban különböző objektumokon is elvégezhetünk azonos névvel illetett tevékenységeket, pl. összeadhatunk jegyespárt, két vektort, két halmazt, két listát, két szöveget, vagy két számot. Az utóbbi két esetre a Pascal nyelvben a + operátort használhatjuk. A C++ lehetővé teszi nekünk a + jel alkalmazását az összes esetre. Ezt a lehetőséget, amely nélkül gyakorlatilag nem lehet C++ programot írni, a nyelv az operátorátdefiniálás (operátor overloading) révén nyújtja. Ez a lehetőség tulajdonképpen a többalakúság operátorok esetében. Az átdefiniálás nem változtatja meg az operátor precedenciáját, egy- vagy kétoperandusos jellegét és az alkalmazandó szintaxist. Nézzünk meg néhány egyszerűbb példát a Lista osztály lehetőségeinek kibővítésére! Előnyös lenne, ha a nevek vektornak oly módon is elérhetnénk az elemeit, mintha az objektumnak lennének az elemei, azaz az objektum lenne indexelhető. Egy másik lehetőség, hogy a < operátornak olyan értelmezést is adjunk, hogy két Lista típusú objektumot hasonlítson össze l1 < l2 formában és igaz értéket (1-et) adjon, ha a l1 elemszáma kisebb l2 elemszámától, egyébként pedig hamis (0) értéket.

9 Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 19./8. A += operátort értelmezhetnénk a Lista típusunk esetében úgy, hogy az l1 += l2 jelentse az l2 lista tartalmának az l1 lista végéhez fűzését és az elemszám aktualizálását, l2 tartalmának változatlanul hagyása mellett. A megoldások: … class Lista {… public: nevtip& operator[ ] (int i ) {return nevek[ i ];} // az objektum indexelhető int operator< (Lista masiklista) {return elemszam < masiklista.elemszam ; } void operator += (Lista masiklista); // deklaráció csak … }; … // masiklista objektum adattagjai elérhetők közvetlenül, mert családtag void Lista::operator+= (Lista masiklista) // definíció { nevtip * nevekuj = new nevtip[elemszam+masiklista.elemszam]; for (int i =0; i <elemszam; i++) strcpy(nevekuj [ i ], nevek[ i ] ); for (i =0; i<masiklista.elemszam; i++) strcpy(nevekuj [elemszam+i ], masiklista.nevek[ i ] ); delete [ ] nevek; // az eredeti tartalom már felszabadítható a Heap-ben nevek= nevekuj; // ráállítjuk az egyesített listára a mutatót elemszam+= masiklista.elemszam; // hogy az új hosszt tartalmazza }

10 Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 19./9. … // az operátorok használata: strcpy( lista[2], "Kuczug Balázs"); // értékadás a lista objektumbeli vektor 2. elemének puts(lista[2]); // hivatkozás ugyanarra az elemre, azaz a nevek vektor 2. elemére Lista l1(5), l2(6); // létrehozunk egy 5 elemű és egy 6 elemű lista objektumot if (l1 =l2"); // a < operátor használata listák között strcpy(l1[2], "Balogh Lujza"); // az 5 elemű lista 2 indexű elemét feltöltöttük strcpy(l2[2], "Nagy Teofil"); // a 6 elemű lista 2 indexű elemét feltöltöttük l1 += l2; // l2 lista tartalmának hozzáfűzése az l1 lista végéhez a += operátorral puts(l1[2]); // "Balogh Lujza" puts(l1[5+2]); // "Nagy Teofil", a lista tényleg hosszabb lett! … Milyen függvényhívással egyenértékű a lista[2] kifejezés? lista.operator[ ] (2) // egy referenciát ad Milyen függvényhívással egyenértékű az l1 < l2 kifejezés? l1.operator< (l2) // 0, vagy 1 Milyen függvényhívással egyenértékű az l1 += l2; utasítás? l1.operator+= (l2); // összetett műveleteket végez


Letölteni ppt "LA C++ programozási nyelv Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 19./0. lRokonok, barátok lÚj műveletek hozzárendelése az."

Hasonló előadás


Google Hirdetések