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



Hasonló dokumentumok
Programozás alapjai II. (5. ea) C++

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

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

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

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

117. AA Megoldó Alfréd AA 117.

Programozás C++ -ban 2007/4

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

C# osztályok. Krizsán Zoltán

Objektumorientált programozás C# nyelven

Osztály és objektum fogalma

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

Objektumorientált programozás C# nyelven III.

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

STL. Algoritmus. Iterátor. Tároló. Elsődleges komponensek: Tárolók Algoritmusok Bejárók

Bánsághi Anna

Származtatási mechanizmus a C++ nyelvben

Osztály szint tagok. Krizsán Zoltán 1 [2012. március 12.] Objektumorientált programozás C# alapokon tananyag

Objektumorientált programozás C# nyelven

A C++ öröklés. (Előfeltétel: 12. tétel ismerete)

Magas szintű programozási nyelvek 2 Előadás jegyzet

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

500. CC Megoldó Alfréd CC 500.

JAVA PROGRAMOZÁS 3.ELŐADÁS

4. Öröklődés. Programozás II

Programozás I gyakorlat

Mit ír ki? feladatok megoldásokkal

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

Programozás II. labor

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

Objektumorientált programozás C# nyelven

Programozás II. ATM példa Dr. Iványi Péter

Bevezetés a programozásba 2

osztályok kapcsolata Származtatatás C++ Izsó Tamás március 19. Izsó Tamás Származtatatás/ 1

Objektumok inicializálása

Bánsághi Anna

STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1

Access adatbázis elérése OLE DB-n keresztül

1. Alapok. Programozás II

Bevezetés a C++ programozási nyelvbe

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

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

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

C++ programozási nyelv Konstruktorok-destruktorok

Objektum elvű alkalmazások fejlesztése Kifejezés lengyel formára hozása és kiértékelése

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

128. AA Megoldó Alfréd AA 128.

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

503.AA Megoldo Arisztid 503.A

Programozás II gyakorlat. 6. Polimorfizmus

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

Elemi Alkalmazások Fejlesztése II.

0. Megoldó Manó 0. Programozás alapjai 2. (inf.) pót zárthelyi gyak. hiányzás: 2 n/kzhp: n/11,5. ABCDEF IB.028/2.

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

SZERVER OLDALI JAVASCRIPT. 3. hét Javascript nyelvi elemek

3. Osztályok II. Programozás II

Objektum elvű alkalmazások fejlesztése. Verem típus osztály-sablonja

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

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

infix kifejezés a+b ab+ +ab postfix kifejezés prefix kifejezés a+b ab+ +ab a+b ab+ +ab Készítette: Szabóné Nacsa Rozália

500. AA Megoldó Alfréd AA 500.

0.2.1 Operátorok túlterhelése (műveletek definiálhatók felhaszn. típusokra) Kutya. Eb1. Eb2. Név (txt): Rex. Blöki. Német juhász 3

Információs Technológia

A WEB programozása - JSP1 dr.gál Tibor őszi félév

Programozás II gyakorlat. 4. Öröklődés

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

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

Java és web programozás

1.AA MEGOLDÓ BERCI AA 1.

INFORMATIKAI ALAPISMERETEK

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

3. Gyakorlat Ismerkedés a Java nyelvvel

500. DD Megoldó Alfréd DD 500.

Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

Programozás alapjai II. (3. ea) C++ Programfejlesztés. Néhány programozási módszer. Feladatanalízis. Modellezés Tervezés. Implementáció (programozás)

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

Országzászlók (2015. május 27., Sz14)

VHDL szimuláció. Tervezés. Labor II. Dr. Hidvégi Timót

Osztályok. 4. gyakorlat

Rekurzió. Horváth Gyula.

Java és web programozás

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

Programozás alapjai II. (8. ea) C++ többszörös öröklés, cast, perzisztencia

Programozás alapjai II. (8. ea) C++ többszörös öröklés, cast, perzisztencia

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

AA MEGOLDÓ ALADÁR AA

abkezel.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.sql.*; public class abkezel extends JFrame {

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) {} };

Generikus Típusok, Kollekciók

Programozás BMEKOKAA146. Dr. Bécsi Tamás 1. Előadás

Programozási nyelvek Java

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

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

Programfejlesztés. Programozás alapjai II. (3. ea) C++ Néhány programozási módszer. Korai szoftverkészítés jellemzői. Gépi nyelv? Strukturált tervezés

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

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

INFORMATIKAI ALAPISMERETEK

Programozás alapjai II. (2. ea) C++ Programfejlesztés. Néhány programozási módszer. Feladatanalízis. Modellezés Tervezés. Implementáció (programozás)


Átírás:

Programozás alapjai II. (5. ea) C++ mutatókonverziók, heterogén kollekció Szeberényi Imre BME IIT <szebi@iit.bme.hu> Öröklés (ismétlés) Egy osztályból olyan újabb osztályokat származtatunk, amelyek rendelkeznek az eredeti osztályban már definiált tulajdonságokkal és viselkedéssel. Analitikus Korlátozó A tagfüggvények átdefiniálhatók (overload) virtuális függvény: hogy a tagfüggvény alaposztály felől is elérhető legyen M Ű E G Y E T E M 7 8 C++ programozási nyelv BME-IIT Sz.I. 06.03.. - - C++ programozási nyelv BME-IIT Sz.I. 06.03.. - - Analitikus öröklés példa (ism.) class Pont { int x, y; Pont(int x, int y) :x(x), y(y) { void set(int x, int y) {x = x; y = y; class Pont3D :public Pont { int z; Pont3D(int x, int y, int z) Bővült :Pont(x, y), z(z) { void set(int x, int y, int z) { Pont::set(x, y); z = z; Pont int x, y Pont3D int z C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 3 - Korlátozó öröklés példa/ (ism.) Szeretnénk egy stack és egy queue osztályt: mindkettő tároló nagyon hasonlítanak, de eltér az interfészük: o put, get <> push, pop önállóan vagy örökléssel? class Queue {. void put( int e ); int get( ); class Stack {. void push( int e ); int pop( ); C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 4 - Korlátozó öröklés példa/ (ism.) class Stack : private Queue { // privát: eltakar a külvilág felé int nelem; Továbbhívjuk a Get()-et Stack( ) : nelem(0) { int pop( ) { nelem--; return(get()); Queue void push(int e) { put(e); // betesz for( int i = 0; i < nelem; i++ ) put( ),get( ) put(get( )); // átforgat nelem++; Stack Nem hatékony, csak példa! push( ), pop( ) Stack s; s.pop(); s.get() C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 5 - Szakasz végpont rajzol() Virtuális tagfüggvény (ism.) Alakzat poz, szin mozgat() virtual rajzol() Kör sugár rajzol() rajzol() "átdefiniálása" virtuális függvénnyel átdefiniálása: fv overload Alakzat::rajzol(); Mit hív? késői kötés C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 6 -

Fontos C++ sajátságok Konstruktor nem lehet virtuális Destruktor igen, és érdemes odafigyelni rá Alaposztályból dinamikus adattagot tartalmazó osztályt hozunk létre, majd ezt az alaposztály "felöl" használjuk (töröljük). A konstruktorból hívott (saját) virtuális függvény még nincs átdefiniálva! A virt. táblát maga konstruktor tölti ki! (kötés) absztrakt osztály estén NULL pointer! class Pont { protected: int x, y; Inicializálás / (ism.) Pont(int x = 0, int y = 0) { x = x; y = y; class Pont3D :public Pont { int z; Pont3D(int x, int y, int z) Legyen default, mert. Alaposztály konstruktora mikor hívódik? Mindig lehet így? {x = x; y = y; z = z; C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 7 - C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 8 - Inicializálás / (ism.) class Pont { protected: int x, y; Pont(int x, int y) : x(x), y(y) { class Pont3D :public Pont { int z; Nem fontos a default. Alaposztály konstruktora Pont3D(int x, int y, int z) : Pont(x, y), z(z) { Inicializálás /3 (ism.) class FixKor :public Pont { double& r; const double PI; Kötelező inicializálni! int x, y; Kor(int x, int y, double& r) :x(x), y(y), r(r), PI(3.4) { Melyik y? Van már this? class FixKor :public Pont { double& r; static const double PI; const double Kor::PI = 3.4; // statikus tag, létre kell hozni C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 9 - C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 0 - Explicit konstruktor Az egyparaméteres konstruktorok egyben automatikus konverziót is jelentenek: pl: String a = "hello"; String a = String("hello"); Ez kényelmes, de zavaró is lehet: tfh: van String(int) konstruktor, ami megadja a string hosszát, de nincs String(char) konstruktor; ekkor: String b = 'x'; String b =String(int('x')); nem biztos, hogy kívánatos. Az aut. konverzió az explicit kulcsszóval kapcsolható ki. (pl: explicit String(int i);) C++ programozási nyelv BME-IIT Sz.I. 06.03.. - - Öröklés és polimorfizmus struct A { void valami() { cout << "A valami" << endl; void semmi() { cout << "A semmi" << endl; struct B: public A{ void valami() { cout << "B valami" << endl; void valami(int) { cout << "B valami int" << endl; B b; b.valami(); // B valami b.valami(); // B valami(int) b.semmi(); // A semmi b.a::valami(); // A valami b.a::valami(int) // HIBA C++ programozási nyelv BME-IIT Sz.I. 06.03.. - -

Mutatókonverzió örökléskor Mutatókonverzió = rejtett objektumkonverzió Kompatibilitás: öröklés kompatibilis memóriakép kompatibilis viselkedés (tagfüggvények) class Alap {. class Pub : public Alap {. class Priv : private Alap {. C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 3 - Alap * pb viselkedés kompatibilis? Konverzió alaposztályra alap új rész Pub vagy Priv memóriakép kompatibilis Pub pub; // pub kaphatja az Alap üzeneteit Alap * pb = &pub; // nem kell explicit típuskonverzió Priv priv; // priv nem érti az Alap üzeneteit pb = (Alap *)&priv;// mégis érti explicit konverzió! C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 4 - Konverzió származtatott osztályra Pub *pd Priv *pd viselkedés NEM kompatibilis alap új rész alap memóriakép NEM kompatibilis Alap alap; Pub *pd = (Pub *) &alap; v. Priv *pd = (Priv *) &alap; // nem létező adatmezőket és üzeneteket lehet elérni // veszély: explicit konverzió C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 5 - Függv. elérése alap. o. mutatóval class Alakzat { virtual void rajz() = 0; void k(); class Szakasz : public Alakzat { void rajz(); void k(); class Kor : public Alakzat { void rajz(); void k(); Alakzat* tar[00]; tar[0] = new Szakasz(.); // konverzió, (kompatibilis) tar[] = new Kor(); // konverzió, (kompatibilis). for (int i = 0; i < 00; i++ ) { tar[i] ->rajz(); tar[i]->k(); Származtatott o. fv. Alap oszt. függvénye C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 6 - Heterogén gyűjtemények Különböző típusú objektumokat egy közös gyűjteménybe tesszük Egységes kezelés: valamilyen viselkedési kompatibilitás egy öröklési hierarchiából definiált objektumokat tehetünk heterogén szerkezetbe kompatibilitásból származó előnyök (pl. alaposztály pointere) kihasználása Heterogén kollekció példa Egy rendszer eseményeit kell naplózni. Az események egymástól eltérő adattartamúak, és esetleg új események is lesznek, amit még nem ismerünk. Események sorrendje fontos, ezért célszerűen egy tárolóban kell lenniük. Az eseménynapló megnézésekor meg kell mutatni azt is, hogy mely eseményeket néztük meg már korábban. C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 7 - C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 8 -

Eseménykezelő megvalósítása Eseménykezelő megvalósítása/ Event * checked show( ) Event Event.... show( ) show( ) EventList add( ), list( )... Még nem ismerjük, de nem is kell! class Event { bool checked; Event ( ) :checked(false) { virtual void show( ) { cout<<" Checked: "; cout<<checked<<endl; checked = true; virtual ~Event() { class Event :public Event { Event(); void show ( ) { cout <<. ; Event::show(); Hurok? C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 9 - C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 0 - Eseménykezelő megvalósítása/3 Eseménykezelő használata class EventList { int nevent; Event *events[00]; EventList( ) { nevent = 0; void add(event *e) { events[nevent++] = e; void list( ) { for (int i = 0; i < nevent; i++) events[i]->show(); ~EventList() { for (int i = 0; i < nevent; i++) delete events[i]; Pointer! Származtatott osztály függvénye Megszűnik az esemény is (komponens reláció) class Event { class Event :public Event { class Event :public Event { class EventList { EventList list; list.add(new Event(.)); list.add(new Event(.)); list.add(new Event9(.)); list.list(); Új esemény: csupán definiálni kell az új osztályt C++ programozási nyelv BME-IIT Sz.I. 06.03.. - - C++ programozási nyelv BME-IIT Sz.I. 06.03.. - - Heterogén kollekció összefoglalás Különböző típusú objektumokat egy közös gyűjteménybe tesszük. Kihasználjuk az öröklésből adódó kompatibilitást. Nagyon gyakran alkalmazzuk könnyen bővíthető, módosítható, karbantartható Tipikus hiba class EventList { Nem pointert tárol! int nevent; Event events[00]; EventList( ) { nevent = 0; void add(event& e) { events[nevent++] = e; void add(event* e) { events[nevent++] = *e; void list( ) { for (int i = 0; i < nevent; i++) events[i].show(); Event::show() Adavesztés!! A származtatott rész elveszik! C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 3 - C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 4 -

Ki szabadít fel? class EventList { int nevent; Event *events[00];. void add(event* e) { events[nevent++] = e; void list( ) { for (int i = 0; i < nevent; i++) events[i]->show(); ~EventList() {. for (int i = 0; i < nevent; i++) delete events[i]; list.add(new Event(.)); // ~Event(); Virtuális kell! C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 5 - Virtuális destruktor újból class Event { virtual void show( ) { ; virtual ~Event() { ; Event *ep = new Event(0); delete ep; class Event :public Event { int *p; Event(int s) { p = new int[s];. ~Event() { delete[] p; Más, mint a többi fv. C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 6 - Digitális áramkör modellezése Digitális jel: üzenet (objektum) Áramköri elemek: objektumok bemenet, kimenet, viselkedés (f(x)) kapcsoló, kapu, drót, forrás, csomópont Objektumok a valós jelterjedésnek megfelelően egymáshoz kapcsolódnak. (üzennek egymásnak) Visszacsatolás megengedett. Bemenetek Modell f(x) Visszacsatolás Kimenetek A változásokat üzenetek továbbítják. Ha nincs változás, nem küldünk újabb üzenetet. Csak véges számú iterációt engedünk meg. C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 7 - C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 8 - Áramköri elemek felelőssége Kapcsolatok (bemenet/kimenet) kialakítása, nyilvántartása. Bejövő üzenetek tárolása összehasonlítás céljából. Válaszüzenetek előállítása és továbbítása a bejövő üzeneteknek és a működésnek megfelelően. Osztályhierarchia Obj Conn Drot Csp NAND R_S_FF Forras 3 3 + 4 C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 9 - C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 30 -

Obj: alaposztály Minden áramköri elem ebből származik Felelőssége: az objektumok közötti kapcsolatok leírása (a Conn osztály dinamikus tömbje) kapcsolatokon keresztül az üzenetek ( objektum) továbbítása, a működést (viselkedést) megvalósító függvény elérése (a set virtuális függvényen keresztül). Obj: absztrakt alaposztály class Obj { String nev; // objektum neve Pin nk; // kapcsolódási pontok száma Conn *konn; // kapcsolatok leírása Obj(const Obj&) ; // hogy ne lehessen használni Obj& operator=(const Obj&); // hogy ne lehessen haszn. Obj(const char *n, Pin k) : nev(n) { konn = new Conn[nk = k]; virtual ~Obj() { delete[] konn; // tömb felszab. void setnev(const char *n) { nev =String(n); // név beáll. void setconn(pin k, Obj& o, Pin on); // összekapcs. void uzen(pin k, msg); // üzen virtual void set(pin n, msg) = 0; //működtet C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 3 - C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 3 - Conn: kapcsolatok tárolása Egy objektumkapcsolatot leíró osztály Példányaiból felépített dinamikus tömb (Obj::konn) írja le egy objektum összes kapcsolatát Miért nem referencia? class Conn { Obj *obj; // ezen objektumhoz kapcsolódik Pin n; // erre a pontra Conn() :obj(null) { void setconn(pin k, Obj& o) { n = k; obj = &o; // beállít Obj *getconn(pin& k) { k = n; return(obj); // lekérdez : jel mint üzenet Digitális jelet reprezentáló osztály undef, jel 0 és jel értéke van. A végtelen iteráció elkerülése végett a jelszint mellet egy iterációs számláló is van. Megvalósítása struktúrával, mivel az adattakarás csak nehezítene. Műveletei: msg == msg msg!= msg msg + msg --msg C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 33 - C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 34 - : jel mint üzenet / struct { enum msgt { undef, jel typ; // típus bool J; // jelszint 0 v. int c; // iterációs számláló (msgt t = undef, bool j = false, int n = 0) :typ(t), J(j), c(n) { // két üzenet egyenlő, ha az típusuk és jelszintjük is azonos bool operator==(const & m) const { return(typ == m.typ && J == m.j); bool operator!=(const & m) const { return(!operator==(m)); operator+(const &m) const { return (std::max(typ, m.typ, J+m.J, std::max(c,m.c)); & operator--() { if (--c <= 0) throw "Sok Iteracio!"; return(*this); pre-dekremens op. C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 35 - Üzenet továbbítása /** * Üzenet (msg) küldése a k. pontra kapcsolódó obj. felé */ void Obj::uzen(Pin k, msg) { Pin n; // kapcsolodó objektum kapcs. pontja if (k >= nk) throw "Uzenet hiba"; // hiba, nincs ilyen végpont if (Obj *o = konn[k].getconn(n)) { o->set(n, --msg); // szomszéd működtető függvénye C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 36 -

Drót obj. modellje Drót Obj nev, pin, konn setnev(), setconn(), uzen(), Drot veg[] get() Conn obj, n setconn(), getconn() J, c ==(),!=() --(), +() class Drot :public Obj { protected: // megengedjük a származtatottnak veg[]; // két vége van, itt tároljuk az üzeneteket Drot(const char *n = "") : Obj(n, ) { // végű obj. Létrehozása get() const { return veg[0] + veg[]; //bármelyik vég void set(pin n, msg); // működtet void Drot::set(Pin n, msg) { if (veg[n]!= msg) { // ha változott veg[n] = msg; // megjegyezzük és uzen(n^, msg); // elküldjük a másik végére (vezet) C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 37 - C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 38 - Csomópont class Csp :public Obj { protected: // megengedjük a származtatottnak veg[3]; // három vége van, itt tároljuk az üzeneteket Csp(const char *n = "") : Obj(n, 3) { // 3 végű objektum void set(pin n, msg); // működtet void Csp::set(Pin n, msg) { if (veg[n]!= msg) { // ha változott veg[n] = msg; // megjegyezzük és uzen((n+)%3, msg); // elküldjük a másik végére uzen((n+)%3, msg); C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 39 - Kapcsoló class Kapcsolo :public Drot { // Drótból bool be; // állapot Kapcsolo(const char *n = "") : Drot(n), be(false) { void set(pin n, msg); jel, false, lehetne undef void kikap() { be = false; uzen(0, (::jel)); uzen(, (::jel)); void bekap() { be = true; uzen(0, veg[]); uzen(, veg[0]); void Kapcsolo::set(Pin n, msg) { if (be) Drot::set(n, msg); // be van kapcsolva, drótként viselk. else veg[n] = msg; // ki van kapcsolva, csak megjegyezzük C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 40-0 NAND kapu class NAND :public Obj { veg[3]; // három "vége" van NAND(const char *n = "") : Obj(n, 3) { // 3 végű obj. létreh. void set(pin n, msg); // működtet get() { return(veg[]); // kim. lekérdezése void NAND::set(Pin n, msg) { if (n!= && veg[n]!= msg) { // ha változott bemenet veg[n] = msg; // megjegyezzük uzen(, veg[] = (::jel,!(veg[0].j * veg[].j), msg.c)); // üzenünk a kimeneten kimenet előállítása ciklusszám marad S_ (0) R_ () N0 0 0 N Q () Q_ (3) R_S_ tároló Class R_S_FF :public Obj { protected: veg[4]; // négy "vége" van NAND N[]; // két db NAND kapu, komponens R_S_FF(const char *n) : Obj(n, 4) { N[0].setConn(, N[], 0); // összekötések létrehozása N[].setConn(, N[0], 0); void set(pin n, msg); // működtet get(int i) { // kimenet lekérdezése if (i >= ) i = 0; return(veg[i+]); C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 4 - C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 4 -

S_ (0) R_ () R_S_ tároló / 0 0 N0 N Void R_S_FF::set(Pin n, msg) { if (n < && veg[n]!= msg) { // ha input és változott, veg[n] = msg; // letárolja N[n].set(, msg); // megfelelő bemenetre küldi uzen(, veg[] = N[0].get()); // üzen a kimeneten uzen(3, veg[3] = N[].get()); // üzen a kimeneten Kimenetek előállítása, mert bent nincs csomópont. C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 43 - Q () Q_ (3) Szimulátorunk próbája Kapcsolo K("K"), K("K"); Forras F("F"), F("F"); R_S_FF FF("FF"); try { F.setConn(0, K, 0); FF.setConn(0, K, ); F.setConn(0, K, 0); FF.setConn(, K, ); F.init(); F.init(); K.bekap(); K.bekap(); 00 cerr << FF.get(0).J << FF.get().J << FF.get().J << FF.get(3).J << endl; K.kikap(); cerr << FF.get(0).J << FF.get().J << FF.get().J << FF.get(3).J << endl; K.bekap(); cerr << FF.get(0).J << FF.get().J << FF.get().J << FF.get(3).J << endl; K.kikap(); cerr << FF.get(0).J << FF.get().J << FF.get().J << FF.get(3).J << endl; catch (const char *s) { cerr << s << endl; C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 44 - F F K FF K 0 00 0 Összefoglalás Öröklés újrafelhasználhatóság kompatibilitás heterogén kollekció pointer konverzió adatvesztés virtuális tagfüggvények absztrakt alaposztály C++ programozási nyelv BME-IIT Sz.I. 06.03.. - 45 -