Osztálytervezés és C++ implementációs ajánlások I.

Hasonló dokumentumok
Osztálytervezés és implementációs ajánlások

Osztálytervezés és implementációs ajánlások

Osztály tervezési szempontok és C++ implementációs ajánlások

Osztály tervezési szempontok és C++ implementációs ajánlások

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Objektumok inicializálása

Virtuális függvények (late binding)

és az instanceof operátor

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

Származtatási mechanizmus a C++ nyelvben

Globális operátor overloading

Programozás II. 4. Dr. Iványi Péter

OOP: Java 8.Gy: Abstract osztályok, interfészek

Java V. Osztályszint. lyszintű ű tagok. Példányváltozó. Osztályváltozó. Általános Informatikai Tanszék Utolsó módosítás:

Java III. I I. Osztálydefiníció (Bevezetés)

Osztályok. 4. gyakorlat

Java III. I I. Osztálydefiníció (Bevezetés)

A C++ szigorúbban kezeli a típuseltéréseket, mint a C nyelv Lehetséges típuskonverziók:

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

C++ programozási nyelv

C++ programozási nyelv Konstruktorok-destruktorok

C++ programozási nyelv Struktúrák a C++ nyelvben

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Osztály és objektum fogalma

Java VI. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. Java VI.: Öröklődés JAVA6 / 1

Programozás II gyakorlat. 8. Operátor túlterhelés

JAVA PROGRAMOZÁS 2.ELŐADÁS

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

C# osztálydeníció. Krizsán Zoltán 1. .net C# technológiák tananyag objektum orientált programozás tananyag

Visual C++ osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés.

Bevezetés a C++ programozási nyelvbe

OOP #14 (referencia-elv)

Számítógép és programozás 2

3. Osztályok II. Programozás II

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

ISA szimulátor objektum-orientált modell (C++)

Bevezetés a programozásba Előadás: A const

Java programozási nyelv 4. rész Osztályok II.

C++ referencia. Izsó Tamás február 17. A C++ nyelvben nagyon sok félreértés van a referenciával kapcsolatban. A Legyakoribb hibák:

Programozás alapjai II. (4. ea) C++

Már megismert fogalmak áttekintése

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

Programozás módszertan

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Kivételkezelés a C++ nyelvben Bevezetés

Objektumorientált szoftverfejlesztés alapjai

1. Bevezetés A C++ nem objektumorientált újdonságai 3

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

Felhasználó által definiált adattípus

Java VII. Polimorfizmus a Java nyelvben

1. Öröklés Rétegelés Nyilvános öröklés - isa reláció Korlátozó öröklődés - has-a reláció

Objektumelvű programozás

5. Gyakorlat. struct diak {

Java VII. Polimorfizmus a Java nyelvben

Java programozási nyelv 5. rész Osztályok III.

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

Programozási nyelvek Java

Pénzügyi algoritmusok

Java II. I A Java programozási nyelv alapelemei

C programozási nyelv Pointerek, tömbök, pointer aritmetika

Programozás módszertan p.1/46

Az alábbi példában a Foo f(5); konstruktor hívása után mennyi lesz f.b értéke? struct Foo { int a, b; Foo(int c):a(c*2),b(c*3) {} };

Programozási nyelvek Java

Pénzügyi algoritmusok

Bevezetés a programozásba Előadás: Tagfüggvények, osztály, objektum

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Objektum orientált kiterjesztés A+ programozási nyelvhez

1. Alapok. Programozás II

C++ programozási nyelv

OOP és UML Áttekintés

Programozási Nyelvek: C++

Objektum orientált programozás Bevezetés

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

OOP alapok Egy OOP nyelvet három fontos dolog jellemez. egységbezárás ( encapsulation objektumoknak öröklés ( inheritance

Absztrakció. Objektum orientált programozás Bevezetés. Általános Informatikai Tanszék Utolsó módosítás:

500. AA Megoldó Alfréd AA 500.

Programozás. C++ osztályok. Fodor Attila. Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék

Alprogramok, paraméterátadás

Programozás C++ -ban

Programozás C++ -ban

ELTE SAP Excellence Center Oktatóanyag 1

Java és web programozás

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

Eseménykezelés. Szoftvertervezés és -fejlesztés II. előadás. Szénási Sándor.

Bevezetés a programozásba előadás: Öröklődés

Programozás C és C++ -ban

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

Programozás BMEKOKAA146. Dr. Bécsi Tamás 5. előadás

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Programozás C++ -ban 2007/7

Programozás C++ -ban

Programozás II. 6.Öröklés Dr. Iványi Péter

Abstract osztályok és interface-ek. 7-dik gyakorlat

Elemi Alkalmazások Fejlesztése II.

Programozás II gyakorlat. 6. Polimorfizmus

Java II. I A Java programozási nyelv alapelemei

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Bevezetés, a C++ osztályok. Pere László

Átírás:

Osztálytervezés és C++ implementációs ajánlások I. Miskolci Egyetem Általános Informatikai Tanszék Osztálytervezés és implementációs kérdések I. OTERV1 / 1 Osztály tervezés Egy nyelv szabályrendszere számos konstrukciót megenged A software fejlesztés során egy adott problémát kell megoldani Az objektum orientált program a valóság valamely részének a modellje Szükséges tanulmányozni, hogy adott cél elérése érdekében milyen nyelvi szerkezet(ek) használata a legcélszerűbb Osztálytervezés és implementációs kérdések I. OTERV1 / 2 Mi is az osztály? Programozástechnikai szempontból típus. Programtervezési szempontból a modellezendő valóság valamely fogalmának modellje. A programokban kétféle osztályok lehetnek: közvetlenül az alkalmazási terület (application domain) fogalmait ábrázoló osztályok a programok elkészítéséhez szükséges osztályok Osztálytervezés és implementációs kérdések I. OTERV1 / 3

Mit ábrázolhatnak az osztályok? Alkalmazási terület osztályai: Felhasználói fogalmak (pl. teherauto) Felhasználói fogalmak általánosításai (pl. jármű) A megvalósítás osztályai: Hardware/software erőforrások (pl. memória, i/o) Más osztályok implementálásához szükséges osztályok (pl. listák, vermek stb.) Beépített adattípusok és vezérlési szerkezetek Osztálytervezés és implementációs kérdések I. OTERV1 / 4 Osztályok közötti kapcsolatok Logikai szintű kapcsolatok általánosítás/pontosítás (is-a) tartalmazás (has-a) használat (use) Osztálytervezés és implementációs kérdések I. OTERV1 / 5 Az általánosítás/pontosítás implementálása Leszármaztatási mechanizmus (öröklődés) segítségével public öröklési mód szükséges A leszármazott osztály objektuma egyben ős objektum is. Osztálytervezés és implementációs kérdések I. OTERV1 / 6

Példa: öröklődés class CSzemely { } class CHallgato : public CSzemely { } void SortIszik( const CSzemely& sz ); void FeladatotBead(const CHallgato& h); Osztálytervezés és implementációs kérdések I. OTERV1 / 7 Példa: öröklődés (folyt.) CHallgato nagypista; CSzemely kispista; SortIszik( kispista ); // OK // OK, mert egy Hallgato egyben // Szemely is SortIszik( nagypista ); // Hibás, mert egy Szemely nem // biztos, hogy Hallgato is FeladatotBead( kispista ); Osztálytervezés és implementációs kérdések I. OTERV1 / 8 Példa: hibás öröklődés class CMadar { public: CKaja MitEszik(void); void Repul(void); } class CStrucc: public CMadar { } A CStrucc örökli a repülés képességét a CMadar osztálytól. Osztálytervezés és implementációs kérdések I. OTERV1 / 9

Példa: hibás öröklődés (folyt.) A hiba oka: a természetes nyelv pontatlansága. Mit jelent pontosan: "A madár tud repülni" "Minden madár tud repülni" "A madarak általában tudnak repülni" Nem a valóság viszonyait modelleztük. Osztálytervezés és implementációs kérdések I. OTERV1 / 10 Példa: hibás öröklődés javítása Egyik lehetséges javítás: class CMadar { public: CKaja MitEszik(void); bool TudRepulni(void); } class CStrucc : public CMadar { } Csak a repülés lehetőségét örökli. Osztálytervezés és implementációs kérdések I. OTERV1 / 11 Példa: hibás öröklődés javítása (folyt) class CMadar { public: CKaja MitEszik( void ) ; }; class CGyalogMadar : public CMadar { }; class CRendesMadar : public CMadar { public : void Repul( void ) ; }; class CStrucc : public CGyalogMadar{ }; class CSas : public CRendesMadar{ }; Osztálytervezés és implementációs kérdések I. OTERV1 / 12

A tartalmazás implementálása Kétféle tartalmazás kapcsolat: agregáció: a rész az egészhez tartozik, de önállóan is létező entitás kompozíció: a rész önmagában nem létezhet, csak valaminek a részeként Osztálytervezés és implementációs kérdések I. OTERV1 / 13 A tartalmazás implementálása: aggregáció Lehetséges megoldások: tag objektum pointere vagy referenciája a tartalmazó osztályban hátrány: szoros kapcsolat a tartalmazó és a tartalmazott objektum között (konzisztencia!!!) a tartalmazott private leszármaztatása a tartalmazó osztályból hátrány: ilyenkor csak osztály szinten fejezi ki a tartalmazott önálló voltát. Osztálytervezés és implementációs kérdések I. OTERV1 / 14 Példa: aggregáció implementálása (Tag objektum hátrány: implementációs szinten nem fejezi ki a rész önállóságát!) Példa: class CAuto { Cmotor* m_motorja ; Ckerek* m_kerekei[5] ; } Osztálytervezés és implementációs kérdések I. OTERV1 / 15

Tartalmazás implementálása: kompozíció Lehetséges megoldások: tag objektum A tartalmazó osztályban lokális osztálydefiníció a tartalmazott számára Osztálytervezés és implementációs kérdések I. OTERV1 / 16 Használat kapcsolat implementálása Fajtái: (CX és CY osztályok) CX használja a CY nevet (feltételezi, hogy CY deklarált a használat helyén) adattag típusa tagfüggvény visszatérési értékének vagy paramétereinek típusa CX használja a CY osztályt (láthatósági szabályok alapján) a CY egy tagfüggvényét írja/olvassa a CY egy adattagját Osztálytervezés és implementációs kérdések I. OTERV1 / 17 Használat kapcsolat impl. (folyt.) CX létrehoz egy CY típusú objektumot statikus definíció new operátorral dinamikusan CX veszi CY méretét Probléma a használat kapcsolat implementálásával: Csak közvetett nyelvi eszközök jelzik az ilyen kapcsolatokat Korlátozó tényezők: azonosítók lexikális érvényességi tartománya osztály tagjainak láthatósági attribútumai Osztálytervezés és implementációs kérdések I. OTERV1 / 18

Információ rejtés A jól tervezett osztály belső részleteinek ismerete szükségtelen a használatához Az osztály használata csak annak interface-e segítségével lehetséges. Egy objektum a külvilággal csak az interface-en keresztül képes kommunikálni. Osztálytervezés és implementációs kérdések I. OTERV1 / 19 Osztály interface fogalma a public tagfüggvények összessége ezt kell ismernie az osztály használójának a leszármazott osztály se tételezzen fel implementációs részleteket a bázisosztályáról A friend függvények és osztályok csak feltétlenül szükséges esetben használjuk, mert ellentmond az információ rejtés alapelvének protected függvények és adattagok implementációs függést hoz létre az ős és a leszármazott osztály között Osztálytervezés és implementációs kérdések I. OTERV1 / 20 A jó osztály interface 1. Teljes minden funkciót tartalmaz, ami az osztálytól elvárható nem az adott alkalmazás szempontjai határozzák meg újrafelhasználható egység Minimális nem tartalmaz a felhasználó számára érdektelen (esetleg veszélyes) elemeket belső felhasználású funkciók private vagy protected minősítésűek a belső áttervezés nincs rá hatással Osztálytervezés és implementációs kérdések I. OTERV1 / 21

A jó osztály interface 2. Kezelhető méretű általában legfeljebb néhány tíz metódus A sok funkció között nagyobb valószínűséggel lesznek hasonlóak (félreértés veszélye!) A terjedelmes interface általában tervezési hibára utal: Az interface része belső funkció is Az osztály határait nem jól állapítottuk meg, és túl sok feladatot akarunk rábízni. A helyes architektúra kialakítása érdekében az eredetileg tervezett osztályt több osztályra kell bontani, és ezek között leszármaztatással vagy más mechanizmussal megteremteni a kapcsolatot. Osztálytervezés és implementációs kérdések I. OTERV1 / 22 Az osztály interface részei Kezelő függvények inicializáló, értékadó, konverziós stb. függvények sokszor nem is a felhasználó program, hanem a fordítóprogram implicite hívja meg. Elérési függvények Az adattagok értékének elérésére vagy azok értékének módosítására. Munkavégző függvények Az osztály lényegi funkcióit aktivizáló függvények. Osztálytervezés és implementációs kérdések I. OTERV1 / 23 Kezelő függvények A kezelő függvények kialakítása az osztály használhatóságát alapvetően befolyásolja Egyes kezelő függvények hiánya vagy helytelen implementációja a jól implementált munkavégző függvények ellenére is programhibákhoz vagy hibás működéshez vezethet Osztálytervezés és implementációs kérdések I. OTERV1 / 24

Kezelő függvények tervezésének szempontjai 1. Hogyan kell az objektumoknak létrejönniük és megszűnniük? konstruktorok száma, paraméterlistájuk a destruktor működése a new és delete operátorok esetleges átdefiniálásának szükségességét. Miben különbözik egy objektum inicializálása és értékadása? A konstruktorok és az értékadó operátor működése. Osztálytervezés és implementációs kérdések I. OTERV1 / 25 Kezelő függvények tervezésének szempontjai 2. Milyen kezdőállapoto(ka)t vehet fel egy objektum a keletkezése után? valamennyi tagfüggvény implementációját befolyásolja, hogy milyen állapotot tételezhet fel, illetve köteles ellenőrizni. Osztálytervezés és implementációs kérdések I. OTERV1 / 26 Kezelő függvények tervezésének szempontjai 3. Milyen legális állapotokat vehet fel az osztály egy objektuma? A tagfüggvények hibaellenőrzését befolyásolja. Van bázisosztálya az új osztálynak? Mely funkciók örökölhetők változatlanul? Vannak-e a bázisosztályban olyan függvények, amelyeket felül kell definiálni a leszármazott osztályban? Vannak-e a bázisosztályban olyan függvények, amelyek használatát le kell tiltani? Osztálytervezés és implementációs kérdések I. OTERV1 / 27

Kezelő függvények tervezésének szempontjai 4. Lesz-e várhatóan az osztálynak leszármazott osztálya? Mely tagfüggvények, esetleg adattagok legyenek protected minősítésűek? Osztálytervezés és implementációs kérdések I. OTERV1 / 28 Kezelő függvények tervezésének szempontjai 5. Milyen operátorok definiálása lehet hasznos az osztály használatában? Az operátor overloading tervezéséhez. A felhasználó számára nem ajánlott, de az osztály implementációja számára hasznos operátorok definiálhatók private (esetleg protected) minősítéssel. Osztálytervezés és implementációs kérdések I. OTERV1 / 29 Kezelő függvények tervezésének szempontjai 6. Miknek lehet szüksége a nem public tagok elérésére? Mely adattagokat és tagfüggvényeket célszerű protected minősítéssel ellátni? Mely osztályok illetve függvények kaphatják meg a friend minősítést? Információ rejtésnek ellentmondó konstrukciók => gondosan elemzendő a szükségességük. Különösen érdemes átgondolni, hogy a public adattag használata valóban elkerülhetetlen-e? Osztálytervezés és implementációs kérdések I. OTERV1 / 30

Konstruktor tervezésének szempontjai A felhasználás kényelme Az alapértelmzés szerinti paraméter értékek használata csökkentheti a szükséges konstruktorok számát. A konstruktornak konverziós szerepe is van! Alapértelmezés szerinti konstruktor átdefiniálása szükséges-e? copy konstruktor! Osztálytervezés és implementációs kérdések I. OTERV1 / 31 Destruktor tervezésének szempontjai Minden "mellékhatás" eltüntetése. Bármilyen (legális) állapotban levő objektumra működnie kell! Osztálytervezés és implementációs kérdések I. OTERV1 / 32 Operátorok tervezésének szempontjai 1. Alapszabály: minden olyan operátort definiálni kell, ami az adott osztály használata során természetesnek tűnik. Tervezési hiba, ha egy átértelmezett operátor jelentése a programozó számára nem egyértelmű. Különösen problémás egy, az operátor eredeti jelentésének ellentmondó jelentés definiálása. Különleges szerepe van az értékadó operátoroknak. Osztálytervezés és implementációs kérdések I. OTERV1 / 33

Operátorok tervezésének szempontjai 2. Ha egy relációs operátort értelmezünk, az összeset definiáljuk. Sokszor hasznos lehet (és bármilyen típusú objektumra alkalmazható) az == és a!= operátorok implementálása. Nagyon sokszor hívott funkcióra kényelmes megoldás lehet a () (függvényhívás-operátor) átdefiniálása. Osztálytervezés és implementációs kérdések I. OTERV1 / 34 Tagfüggvények implementációja Az eddigi programozói tapasztalatok tanulságai Két alapvető cél: Helytelen működés elkerülése Hatékonyabb működés biztosítása Osztálytervezés és implementációs kérdések I. OTERV1 / 35 A const minősítő Használjuk mindenütt, ahol lehetséges Szimbolikus konstans definiálására makródefiníció helyett használjunk const minősítésű és inicializált változót (ekkor vonatkozik rá a típusellenőrzés) Osztálytervezés és implementációs kérdések I. OTERV1 / 36

A const minősítő (emlékeztető) Konstansra mutató pointer const char* nev = "Ficsór"; A konstans értéke így nem változtatható meg a pointeren keresztül, de a pointer tetszőlegesen újradefiniálható. Konstans pointer char* const nev = "Ficsór"; A pointer értéke nem változtatható meg (hiszen konstans). Konstansra mutató konstans pointer const char* const nev = ""; Sem a pointer értéke, sem az általa címzett érték nem változtatható meg Osztálytervezés és implementációs kérdések I. OTERV1 / 37 Konstans tagfüggv ggvény Minősítése az argumentumlista után tett const alapszóval. Az alapszót mind a függvény prototípusában, mind a definícióban ki kell írni. Jelentése: a konstans tagfüggvény nem változtathatja meg egyetlen adattag értékét sem. Egy ilyen utasítás a függvény törzsében fordítási hibát okoz. Osztálytervezés és implementációs kérdések I. OTERV1 / 38 Konstans tagfüggvények használata 1. Minden olyan tagfüggvényt, amely nem változtatja meg az objektum állapotát, deklaráljunk konstans tagfüggvényként. Konstans objektumra csak konstans tagfüggvény hívható meg. Ha egy tagfüggvényből létezik const minősítésű és minősítetlen változat is, const objektumra const tagfüggvény hívódik meg. Osztálytervezés és implementációs kérdések I. OTERV1 / 39

Konstans tagfüggvények használata 2. Az, hogy egy tagfüggvény definíciója nem tartalmaz olyan utasítást, amely valamely adattag értékét közvetlenül megváltoztatja, még nem jelenti azt, hogy valamilyen közvetettebb módon nem változhat az objektum állapota. Egy tagfüggvény számára a const minősítés megadásához gyakran a működésének a funkcionális elemzése szükséges. Példa: CPPEX29 Osztálytervezés és implementációs kérdések I. OTERV1 / 40 Példa konstans tagfüggvényre 1. // Csapda van benne! class CString1 { char* m_pchelemek; public: CString1(const char* szoveg); ~CString1(void); char& operator[] (const int index)const; int hossz(void) const; }; Osztálytervezés és implementációs kérdések I. OTERV1 / 41 Példa konstans tagfüggvényre 2. //Latszolag konstans tagfuggveny, mert //nincs benne ertekadas egy adattagra sem char& CString1::operator[] (const int index) const { return m_pchelemek[index];} // Ez egy igazi const tagfuggveny int CString1::hossz(void) const { return strlen(m_pchelemek);} Osztálytervezés és implementációs kérdések I. OTERV1 / 42

Példa konstans tagfüggvényre 3. Hibás használatot tesz lehetővé: const CString1 nevem(""); cout << nevem[2] << "\n"; // OK! // A forditoprogram szamara OK, // mert const tagfuggvenyt hivunk // meg const objektumra nevem[0] = 'X'; // nevem.operator[](0) = X; Osztálytervezés és implementációs kérdések I. OTERV1 / 43 Példa konstans tagfüggvényre 4. Nem megoldás, hogy "elvesszük" a const minősítést az operator[] függvénytől: const CString2 nevem(""); cout << nevem[2] << "\n; A fordítóprogram hibát jelez, hiszen egy const objektumra nem const tagfüggvényt próbáltunk meghívni. Osztálytervezés és implementációs kérdések I. OTERV1 / 44 Példa konstans tagfüggvényre 5. Megoldás: külön változatot definiálunk az operator[] függvényből a konstans és a nem konstans objektumok számára char& operator[] (const int index); const char& operator[] (const int index) const; Osztálytervezés és implementációs kérdések I. OTERV1 / 45

Példa konstans tagfüggvényre 6. CString1 szoveg("szoveg"); // Korrekt, a // char& operator[] (const int index) // hivodik meg */ szoveg[0] = 'S'; Osztálytervezés és implementációs kérdések I. OTERV1 / 46 const CString1 en(""); // Korrekt: a // const char& operator[] (const int // index) const valtozat hivodik meg, // ezert hibajelzest kapunk en[0] = 'S'; A hibajelzést az okozza, hogy az értékadás baloldalán a const char& típusú függvényérték áll, és a fordítóprogram képes jelezni egy konstans érték referencián keresztül megkísérelt megváltoztatását. Osztálytervezés és implementációs kérdések I. OTERV1 / 47 Objektum átadása hivatkozás szerint 1. Az érték szerint átadott paraméterek és visszatérési érték hatékonysági szempontok miatt kerülendők. A pontos magyarázatra a későbbiekben még visszatérünk! A megváltoztatni nem kívánt paramétereket const minősítővel kell ellátni! Osztálytervezés és implementációs kérdések I. OTERV1 / 48

Referencia objektum helyett 1. Ne adjunk vissza referenciát, ha értéket kell visszaadni. Ez gyakran érvénytelen hivatkozás visszaadását jelenti. Osztálytervezés és implementációs kérdések I. OTERV1 / 49 Ne adjuk vissza lokális objektum címét 1. Helyes implementáció: class CKomplex { double m_valos; double m_kepzetes; public: CKomplex(double v, double k); CKomplex operator+(const Komplex& masik) {return CKomplex(m_valos + masik.m_valos, m_kepzetes + masik.m_kepzetes); } Osztálytervezés és implementációs kérdések I. OTERV1 / 50 Ne adjuk vissza lokális objektum címét 2. Helytelen implementáció: CKomplex& operator+(const CKomplex& masik) { CKomplex eredmeny(m_valos + masik.m_valos, m_kepzetes + masik.m_kepzetes); return eredmeny; } Hiba: megszűnt objektum referenciája! Osztálytervezés és implementációs kérdések I. OTERV1 / 51

Ne adjuk vissza lokális objektum címét 3. Másik helytelen implementáció: CKomplex& operator+(const CKomplex& masik) { CKomplex* eredmeny = new CKomplex ( m_valos + masik.m_ valos, m_kepzetes + masik. m_ kepzetes); return *eredmeny; } Hiba: ki szabadítja fel a lefoglalt helyet? Osztálytervezés és implementációs kérdések I. OTERV1 / 52 Korlátozott láthatóságú adattag 1. Egy tagfüggvény ne adja vissza olyan adattag referenciáját vagy pointerét, vagy olyan pointer vagy referencia típusú adattagot, amelynek a láthatósága kisebb, mint a függvényé. Példa: class CString { private: char* m_pchelemek; public: // HIBA!!! char* elemek(void) {return m_pchelemek;} }; Osztálytervezés és implementációs kérdések I. OTERV1 / 53