osztályok kapcsolata
Származtatatás C++
Izsó Tamás
2014. március 19.
Izsó Tamás
Származtatatás/ 1
osztályok kapcsolata
Dinamikus tagváltozó az osztályban c l a s s RVektor { int n; R a c i o n a l i s ∗p ; public : RVektor ( i n t n=10 ) : n ( n ) , p ( new R a c i o n a l i s [ n ] ) {} ~RVektor ( ) { d e l e t e [ ] p ; } . . . };
Vigyázz a copy konstruktorra és értékadó operátorra Most nem jó a fordító által generált copy konstruktor és értékadó operátor. ˝ elérhetetlenné kell tenni (nem mindig a legjobb Kivülrol megoldás) Meg kell írni. Izsó Tamás
Származtatatás/ 2
osztályok kapcsolata
copy ctor és operator=() class RVektor { int n; R a c i o n a l i s ∗p ; public : . . . RVektor ( const RVektor& o t h e r ) { n = other . n ; p = new R a c i o n a l i s [ n ] ; f o r ( i n t i =0; i
Származtatatás/ 3
osztályok kapcsolata
copy ctor írás operator=() segítségével class RVektor { int n; R a c i o n a l i s ∗p ; public : . . . RVektor ( const RVektor& o t h e r ) { p = 0; ∗ this = other ; } RVektor& operator =( const RVektor& o t h e r ) { i f ( t h i s ! = &o t h e r ) { delete [ ] p ; n= o t h e r . n ; p = new R a c i o n a l i s [ n ] ; f o r ( i n t i =0; i
Származtatatás/ 4
osztályok kapcsolata
operator=() megírása copy ctor felhasználásával class RVektor { int n; R a c i o n a l i s ∗p ; public : . . . void swap ( RVektor& o t h e r ) { int s = other . n ; other . n = n ; n = s ; Racionalis ∗ v = other . p ; other . p = p ; p = v ; } RVektor ( const RVektor& o t h e r ) { . . . } RVektor& operator =( const RVektor& o t h e r ) { RVektor v ( o t h e r ) ; swap ( v ) ; return ∗ this ; } . . . }; Izsó Tamás
Származtatatás/ 5
osztályok kapcsolata
operator=() megírása copy ctor felhasználásával egyszerubben ˝ class RVektor { int n; R a c i o n a l i s ∗p ; public : . . . void swap ( RVektor& o t h e r ) { int s = other . n ; other . n = n ; n = s ; Racionalis ∗ v = other . p ; other . p = p ; p = v ; } RVektor ( const RVektor& o t h e r ) { . . . } RVektor& operator =( RVektor o t h e r ) { swap ( o t h e r ) ; return ∗ this ; } . . . }; Izsó Tamás
Származtatatás/ 6
osztályok kapcsolata
Index operátorok class RVektor { int n; R a c i o n a l i s ∗p ; public : . . . R a c i o n a l i s& operator [ ] ( i n t i ) { i f ( i <0 | | i >=n ) throw " Index h i b a " ; return p [ i ] ; } const R a c i o n a l i s operator [ ] ( i n t i ) const { i f ( i <0 | | i >=n ) throw " Index h i b a " ; return p [ i ] ; } . . . };
Izsó Tamás
Származtatatás/ 7
osztályok kapcsolata
Mit ír ki? class A { int k ; public : A ( const i n t i = 0 ) : k ( i ) { c o u t << ’ k ’ ; } A ( const A& a ) { k = a . k ; c o u t << ’ c ’ ; } void operator =(A& a ) { k = a . k ; f ( a ) ; c o u t << ’ e ’ ; } A& operator ∗ ( i n t i ) { c o u t << i ∗100; r e t u r n ∗ t h i s ; } void f ( A a ) { k ++; c o u t << ’ f ’ ; } ~A ( ) { c o u t << ’ d ’ ; } }; A& operator ∗ ( i n t i , A& a ) { c o u t << i ; r e t u r n a ; } i n t main ( i n t argc , char ∗ argv [ ] ) { A a = A(1); c o u t << ’ \ n ’ ;
osztályok kapcsolata
Mit ír ki? class A { int k ; public : A ( const i n t i = 0 ) : k ( i ) { c o u t << ’ k ’ ; } A ( const A& a ) { k = a . k ; c o u t << ’ c ’ ; } void operator =(A& a ) { k = a . k ; f ( a ) ; c o u t << ’ e ’ ; } A& operator ∗ ( i n t i ) { c o u t << i ∗100; r e t u r n ∗ t h i s ; } void f ( A a ) { k ++; c o u t << ’ f ’ ; } ~A ( ) { c o u t << ’ d ’ ; } }; A& operator ∗ ( i n t i , A& a ) { c o u t << i ; r e t u r n a ; } i n t main ( i n t argc , char ∗ argv [ ] ) { A a = A(1); c o u t << ’ \ n ’ ; / / kcd a = a ∗ 2 ; c o u t << ’ \ n ’ ;
osztályok kapcsolata
Mit ír ki? class A { int k ; public : A ( const i n t i = 0 ) : k ( i ) { c o u t << ’ k ’ ; } A ( const A& a ) { k = a . k ; c o u t << ’ c ’ ; } void operator =(A& a ) { k = a . k ; f ( a ) ; c o u t << ’ e ’ ; } A& operator ∗ ( i n t i ) { c o u t << i ∗100; r e t u r n ∗ t h i s ; } void f ( A a ) { k ++; c o u t << ’ f ’ ; } ~A ( ) { c o u t << ’ d ’ ; } }; A& operator ∗ ( i n t i , A& a ) { c o u t << i ; r e t u r n a ; } i n t main ( i n t argc , char ∗ argv [ ] ) { A a = A(1); c o u t << ’ \ n ’ ; / / kcd / / 200 c f d e a = a ∗ 2 ; c o u t << ’ \ n ’ ; a = 3 ∗ a ; c o u t << ’ \ n ’ ;
osztályok kapcsolata
Mit ír ki? class A { int k ; public : A ( const i n t i = 0 ) : k ( i ) { c o u t << ’ k ’ ; } A ( const A& a ) { k = a . k ; c o u t << ’ c ’ ; } void operator =(A& a ) { k = a . k ; f ( a ) ; c o u t << ’ e ’ ; } A& operator ∗ ( i n t i ) { c o u t << i ∗100; r e t u r n ∗ t h i s ; } void f ( A a ) { k ++; c o u t << ’ f ’ ; } ~A ( ) { c o u t << ’ d ’ ; } }; A& operator ∗ ( i n t i , A& a ) { c o u t << i ; r e t u r n a ; } i n t main ( i n t argc , char ∗ argv [ ] ) { A a = A(1); c o u t << ’ \ n ’ ; / / kcd / / 200 c f d e a = a ∗ 2 ; c o u t << ’ \ n ’ ; / / 3cfde a = 3 ∗ a ; c o u t << ’ \ n ’ ; return 0; }
osztályok kapcsolata
Mit ír ki? class A { int k ; public : A ( const i n t i = 0 ) : k ( i ) { c o u t << ’ k ’ ; } A ( const A& a ) { k = a . k ; c o u t << ’ c ’ ; } void operator =(A& a ) { k = a . k ; f ( a ) ; c o u t << ’ e ’ ; } A& operator ∗ ( i n t i ) { c o u t << i ∗100; r e t u r n ∗ t h i s ; } void f ( A a ) { k ++; c o u t << ’ f ’ ; } ~A ( ) { c o u t << ’ d ’ ; } }; A& operator ∗ ( i n t i , A& a ) { c o u t << i ; r e t u r n a ; } i n t main ( i n t argc , char ∗ argv [ ] ) { A a = A(1); c o u t << ’ \ n ’ ; / / kcd / / 200 c f d e a = a ∗ 2 ; c o u t << ’ \ n ’ ; / / 3cfde a = 3 ∗ a ; c o u t << ’ \ n ’ ; return 0; } //d Izsó Tamás
Származtatatás/ 8
osztályok kapcsolata
Mit ír ki? class S t r i n g { char ∗p ; i n t s i z e ; public : S t r i n g ( ) : p (new char [ 2 ] ) { c o u t << 1 ; } S t r i n g ( const char ∗ ) : p (new char [ 2 ] ) { c o u t << 2 ; } S t r i n g ( S t r i n g &s ) : p (new char [ 2 ] ) { c o u t << 3 ; } ~ S t r i n g ( ) { d e l e t e [ ] p ; c o u t << 4 ; } S t r i n g operator +( S t r i n g &s1 ) { S t r i n g s ; c o u t << 5 ; r e t u r n s ; } char& operator [ ] ( i n t ) { c o u t << 6 ; r e t u r n p [ 0 ] ; } S t r i n g & operator =( const S t r i n g s ) { c o u t << 7 ; r e t u r n ∗ t h i s ; } }; i n t main ( i n t argc , char ∗ argv [ ] ) { S t r i n g s1 ( " r e j t v é n y " ) ; c o u t << e n d l ; S t r i n g s2 ; c o u t << e n d l ; S t r i n g s3=s2 ; c o u t << e n d l ; char c = s3 [ 3 ] ; c o u t << e n d l ; s2 = s3 ; c o u t << e n d l ; s2 = s3 + s2 + s1 ; c o u t << e n d l ; return 0; } Izsó Tamás
Származtatatás/ 9
osztályok kapcsolata
Section 1 osztályok kapcsolata
Izsó Tamás
Származtatatás/ 10
osztályok kapcsolata
Rétegelés c l a s s Address { . . . . . } ; c l a s s Name { . . . . . } ; c l a s s Person { Name name ; Address addr ; ..... }; Reláció A rétegelés "vanegy", vagy keresztül implementált relációt modellez.
Izsó Tamás
Származtatatás/ 11
osztályok kapcsolata
Analítikus (nyilvános) öröklés c l a s s Person {
.....
};
c l a s s Student : p u b l i c Person { ..... }; ..... Reláció ˝ Az analítikus öröklodés (isa) "azegy" relációt jelent. Még helyesebben az "úgy muködik ˝ mint" kapcsolatot jelenti. A fenti példában a diák (Student) "azegy" személy (Person) reláció igaz, tehát használhatjuk a publikus ˝ öröklodést. Izsó Tamás
Származtatatás/ 12
osztályok kapcsolata
Származtatott osztály használata / / Minden személy t á n c o l h a t void dance ( const Person& p ) ; / / Csak a d i á k o k t a n u l n a k . void s t u d y ( const Student& s ) ; Person p ; Student s ; dance ( p ) ; dance ( s ) ;
/ / OK. p egy személy / / rendben s egy diák , " azegy "
study ( s ) ; study ( p ) ;
/ / OK. / / Hiba p nem d i á k .
Izsó Tamás
Származtatatás/ 13
személy
osztályok kapcsolata
Korlátozó öröklés
class Rectangle { . . . . . } ; class Square : p r i v a t e Rectangle { ..... }; Reláció A korlátozó öröklés nem (isa) "azegy" relációt, mivel a származtotott objektum nem "úgy muködik ˝ mint" kapcsolatban áll az alapobjektummal.
Izsó Tamás
Származtatatás/ 14
osztályok kapcsolata
Alaposztály létrehozás class A l l a t { private : char nev [ 2 0 ] ; public : A l l a t ( const char ∗nev ) { s t r c p y ( t h i s −>nev , nev ) ; } v i r t u a l void b em u t a t k oz i k ( ) { c o u t << nev << " vagyok " ; } virtual ~Allat () {} };
Jótanács C++-ban kerüljük a világobjetumokat! Azaz ne származtassunk olyan típusokat egy alaposztályból, akiknek semmi közük nincs egymáshoz. Izsó Tamás
Származtatatás/ 15
osztályok kapcsolata
Származtatás class Kutya : public A l l a t { char g a z d i [ 2 0 ] ; public : Kutya ( const char ∗nev , const char ∗ g a z d i ) : A l l a t ( nev ) { s t r c p y ( t h i s −>gazdi , g a z d i ) ; } void b em u ta t k o z i k ( ) { A l l a t : : b em u t a t k o z i k ( ) ; c o u t << " gazdam " << g a z d i ; } }; void hogy_hivnak ( A l l a t ∗ a l l a t ) { a l l a t −>b e mu t at k o z i k ( ) ; c o u t << e n d l ; } Izsó Tamás
Származtatatás/ 16
osztályok kapcsolata
Származtatás egyik tulajdonsága
Alapelv Mindenhol, ahol az alaposztály használható, ott a származtatott osztályt is használható. Fordítva nem igaz!
Izsó Tamás
Származtatatás/ 17
osztályok kapcsolata
Többalakú viselkedés void hogy_hivnak ( A l l a t ∗ a l l a t ) { a l l a t −>b e m u t a t k o z i k ( ) ; c o u t << e n d l ; } i n t main ( ) { A l l a t ∗ f r a k k = new Kutya ( " Frakk " , " K a r o l y b a c s i " ) ; A l l a t ∗ pok = new A l l a t ( " Odon " ) ; hogy_hivnak ( f r a k k ) ; hogy_hivnak ( pok ) ; return 0; }
Output: Frakk vagyok Odon vagyok
gazdam K a r o l y b a c s i
Izsó Tamás
Származtatatás/ 18
osztályok kapcsolata
Virtuális függvény muködése ˝ hogy_hivnak(Allat* allat) (Külső függvény) Allat virtuális tábla __vptr__Allat void Allat::bemutatkozik(Allat* this) char nev[20] Allat::~Allat(Allat* this) Allat::Allat( Allat* this, const char*nev)
Kutya virtuális tábla __vptr__Kutya void Kutya::bemutatkozik(Kutya* this) char nev[20] (alaposztály tagváltozók)
Kutya::~Kutya(Allat* this)
char gazdi[20]
Kutya::Kutya( Kutya* this, const char*nev, const char*gazdi)
Izsó Tamás
Származtatatás/ 19
osztályok kapcsolata
Objektumorientált programozás
Motto Aki nem használt még virtuális függvényt, az nem írt még objektumorientált programot
Izsó Tamás
Származtatatás/ 20
osztályok kapcsolata
Virtuális függvény felüldefiniálás class B { public : v i r t u a l void f ( ) const { c o u t << "B : : f void g ( ) const { c o u t << "B : : g " ; } }; class D : public B { public : void f ( ) const { c o u t << "D : : f void g ( ) { c o u t << "D : : g " ; } }; class DD : public D { public : void f ( ) { c o u t << "DD : : f " ; } void g ( ) const { c o u t << "DD : : g }; Izsó Tamás
Származtatatás/ 21
"; }
"; }
"; }
osztályok kapcsolata
Virtuális függvény felüldefiniálás void c a l l ( const B& b ) { b. f (); b.g(); } i n t main ( ) { B b; D d; DD dd ; call (b ); call (d ); c a l l ( dd ) ; b. f (); b.g(); d. f (); d.g(); dd . f ( ) ; dd . g ( ) ; return 0; }
// // // // // // // // //
B:: f B:: g D: : f B: : g D: : f B: : g B:: f B:: g D: : f D: : g DD : : f DD : : g
Izsó Tamás
Származtatatás/ 22
osztályok kapcsolata
˝ Szeletelodés
void hogy_hivnak ( A l l a t a l l a t ) { a l l a t . bemutatkozik ( ) ; c o u t << e n d l ; } Output: Frakk vagyok Odon vagyok
Izsó Tamás
Származtatatás/ 23
osztályok kapcsolata
Komplex példa class A l l a t { char ∗nev ; void operator =( const A l l a t & ) ; public : A l l a t ( const char ∗nev ) { t h i s −>nev = new char [ s t r l e n ( nev ) + 1 ] ; s t r c p y ( t h i s −>nev , nev ) ; } A l l a t ( const A l l a t & o t h e r ) { nev = new char [ s t r l e n ( o t h e r . nev ) + 1 ] ; s t r c p y ( nev , o t h e r . nev ) ; } v i r t u a l void hangot_ad ( ) = 0 ; v i r t u a l void b em u ta t k o z i k ( ) = 0 { c o u t << nev << " vagyok " ; } virtual ~Allat () { cout << " ~ " << nev << e n d l ; d e l e t e [ ] nev ; } }; Izsó Tamás
Származtatatás/ 24
osztályok kapcsolata
Kérdések
Miért virtuális a hangot_ad(), és a bemutatkozik() függvény? Miért kell destruktor? Miért kell virtuális destruktor? Mit jelent a bemutatkozik() függvény utáni kód.
Izsó Tamás
Származtatatás/ 25
osztályok kapcsolata
Származtatott osztály class Eger : public A l l a t { public : Eger ( const char ∗nev ) : A l l a t ( nev ) { } void hangot_ad ( ) { c o u t << " c i n −c i n " << e n d l ; } void b em u ta t k o z i k ( ) { A l l a t : : b e m u t a t k o z i k ( ) ; c o u t << e n d l ; } . . . };
Miért kell meghívni az alaposztály konstruktorát. Mért kell a bemutatkozik() függvényben az alaposztály bemutatkozik() függvényét meghívni. Mi történt volna, ha a bemutatkozik() függvényben az alaposztály névterét nem írtuk volna ki. Izsó Tamás
Származtatatás/ 26
osztályok kapcsolata
Kérdések
Miért elég az alaposztályban eldugni az értékadó operátort, és miért nem kellett a származtatott osztályokban? Mi történik, ha nem dugjuk el az értékadó operátort, és a ˝ ˝ írjuk: foprogramban a következot ∗( farm[1] )= ∗( farm[3] );
Izsó Tamás
Származtatatás/ 27
osztályok kapcsolata
Klónozás
Hogyan hozhatunk létre alaposztályra mutató pointer alapján egy hasonló származtatott objektumot? A l l a t ∗ d o l l y = new Barany ( " D o l l y " ) ; Barany ∗ d o l l y 2 = ???
Izsó Tamás
Származtatatás/ 28
osztályok kapcsolata
Klónozás virtuális függvény felhasználásával class A l l a t { public : A l l a t ( const A l l a t & o t h e r ) { . . . } v i r t u a l A l l a t ∗ clone ( ) = 0; }; class Eger : public A l l a t { public : . . . Eger ∗ c l o n e ( ) { r e t u r n new Eger ( ∗ t h i s ) ; } }; class Barany : public A l l a t { public : . . . Barany ∗ c l o n e ( ) { r e t u r n new Barany ( ∗ t h i s ) ; } }; i n t main ( ) { . . . A l l a t ∗ d o l l y = new Barany ( " D o l l y " ) ; . . . Barany ∗ d o l l y 2 = d o l l y −>c l o n e ( ) ; . . . } Izsó Tamás
Származtatatás/ 29
osztályok kapcsolata
Qt platformfüggetlen toolkit
˝ Fejlesztok: Trolltech (1991-2008) Nokia (2008-2011) Digia (2010-) Qt Project (2011-) Izsó Tamás
Származtatatás/ 30
osztályok kapcsolata
Alakzat osztály class A l a k z a t { protected : Pont p0 ; / / / alakzat origója QPen pen ; / / / rajzceruza public : A l a k z a t ( const Pont& p0 , const QPen& pen ) : p0 ( p0 ) , pen ( pen ) { } const Pont& o r i g o ( ) const { r e t u r n p0 ; } v i r t u a l void r a j z o l ( QPainter& p a i n t e r ) const = 0 / / t i s z t á n v i r t u á l i s { p a i n t e r . setPen ( pen ) ; } void mozgat ( const Pont& d ) ; }; class Kor : public A l a k z a t { int r ; / / / sugár public : Kor ( const Pont& p0 , i n t r , const QPen& pen ) ˝ osztály i n i c : A l a k z a t ( p0 , pen ) , r ( r ) / / / os {} / / / kört rajzol void r a j z o l ( QPainter& ) const ; }; Izsó Tamás
Származtatatás/ 31
osztályok kapcsolata
˝ Foprogram
i n t main ( i n t argc , char ∗∗ argv ) { Alakzat ∗ r a j z [ 3 ] ; r a j z [ 0 ] = new Kor ( Pont ( 1 0 0 , 1 0 0 ) , 20 , QPen ( Qt : : green , 2 ) ) ; r a j z [ 1 ] = new Kor ( Pont ( 3 0 0 , 5 0 0 ) , 30 , QPen ( Qt : : red , 5 ) ) ; r a j z [ 2 ] = new Szakasz ( Pont ( 2 0 0 , 4 0 0 ) , 1 0 0 , 2 0 0 ,QPen ( Qt : : black , 5 ) ) ; Q A p p l i c a t i o n app ( argc , argv ) ; MyWidget myWidget ; myWidget . s e t A l a k z a t ( r a j z , 3 ) ; myWidget . show ( ) ; r e t u r n app . exec ( ) ; }
Izsó Tamás
Származtatatás/ 32
osztályok kapcsolata
Származtatott widget osztály class MyWidget : public QWidget { Q_OBJECT bool moving ; A l a k z a t ∗∗ a l a k z a t ; int nalakzat ; int x , y ; public : MyWidget ( ) : moving ( f a l s e ) , n a l a k z a t ( 0 ) {} void s e t A l a k z a t ( A l a k z a t ∗∗ a l a k z a t , i n t n ) { t h i s −>a l a k z a t = a l a k z a t , n a l a k z a t =n ; }; protected : void p a i n t E v e n t ( QPaintEvent ∗ event ) ; void mousePressEvent ( QMouseEvent ∗ event ) ; void mouseReleaseEvent ( QMouseEvent ∗ event ) ; void mouseMoveEvent ( QMouseEvent ∗ event ) ; }; Izsó Tamás
Származtatatás/ 33
osztályok kapcsolata
virtuális függvények átdefiniálása void MyWidget : : mousePressEvent ( QMouseEvent ∗ event ) { i f ( event −>b u t t o n ( ) == Qt : : L e f t B u t t o n ) { moving = t r u e ; t h i s −>s e t C u r s o r ( Qt : : OpenHandCursor ) ; x = event −>x ( ) ; y = event −>y ( ) ; } event −>accept ( ) ; } void MyWidget : : mouseReleaseEvent ( QMouseEvent ∗ event ) { i f ( event −>b u t t o n ( ) == Qt : : L e f t B u t t o n ) { moving = f a l s e ; s e t C u r s o r ( Qt : : ArrowCursor ) ; } event −>accept ( ) ; } void MyWidget : : mouseMoveEvent ( QMouseEvent ∗ event ) { i f ( moving ) { i n t dx = event −>x () − x ; i n t dy = event −>y () − y ; x = event −>x ( ) ; y = event −>y ( ) ; f o r ( i n t i =0; i < n a l a k z a t ; i ++) a l a k z a t [ i ]−>mozgat ( Pont ( dx , dy ) ) ; update ( ) ; event −>accept ( ) ; } } Izsó Tamás
Származtatatás/ 34
osztályok kapcsolata
Rajzolás
void MyWidget : : p a i n t E v e n t ( QPaintEvent ∗ event ) { QPainter p a i n t e r ( t h i s ) ; f o r ( i n t i =0; i < n a l a k z a t ; i ++) a l a k z a t [ i ]−> r a j z o l ( p a i n t e r ) ; }
Izsó Tamás
Származtatatás/ 35
osztályok kapcsolata
Mini iostream ios # streambuf * bp + enum open_mode + ios (streambuf*p) # ios() + virtual ~ios()
istream + istream& operator»(char& c)
fstreambase # fstreambase() + void seek (long, int)
streambuf # char buf[bufsiz]; # char* x_gptr; # char* x_pptr; # bool is_writing; # virtual void overflow(int c) = 0 # virtual void underflow() = 0 # int sbumpc() # void sputc(int c) + streambuf() + virtual ~streambuf() ostream + ostream& operator«(char c)
filebuf - int fd + void overflow(int) + void underflow() + void seek(long, int) + void flush() + filebuf(const char *, int) + ~filebuf()
iostream
ifstream
fstream
ofstream
Jonathan E. Shopiro An Example of Multiple Inheritance in C++: A Model of the Iostream Library Izsó Tamás
Származtatatás/ 36
osztályok kapcsolata
class streambuf class streambuf { protected : / / e nc ap s ul a te s b u f f e r management char b u f [ b u f s i z ] ; / / t h e c h a r a c t e r b u f f e r char ∗ x _ g p t r ; / / g e t p o i n t e r char ∗ x _ p p t r ; / / p u t p o i n t e r bool i s _ w r i t i n g ; / / b u f f e r must be w r i t t e n v i r t u a l void o v e r f l o w ( i n t c ) = 0 ; / / send f u l l b u f f e r v i r t u a l void u n d e r f l o w ( ) = 0 ; / / r e f i l l empty b u f f e r i n t sbumpc ( ) { / / g e t a c h a r a c t e r i f ( x _ g p t r >= &b u f [ b u f s i z ] ) u n d e r f l o w ( ) ; r e t u r n ∗ x _ g p t r ++; } void s p u t c ( i n t c ) { / / p u t a c h a r a c t e r i f ( x _ p p t r >= &b u f [ b u f s i z ] ) o v e r f l o w ( c ) ; else ∗ x _ p p t r ++ = c ; } public : streambuf ( ) : i s _ w r i t i n g ( f a l s e ) , x _ g p t r (& b u f [ b u f s i z ] ) , x _ p p t r (& b u f [ b u f s i z ] ) {} v i r t u a l ~ streambuf ( ) { } }; Izsó Tamás
Származtatatás/ 37
osztályok kapcsolata
class ios, istream, ostream, iostream class i o s { / / a c o n n e c t i o n t o a streambuf public : enum open_mode { i n =1 , o u t =2 } ; i o s ( streambuf ∗p ) : bp ( p ) { } v i r t u a l ~ i o s ( ) { d e l e t e bp ; } protected : streambuf ∗ bp ; i o s ( ) { } / / never c a l l e d }; class i s t r e a m : public v i r t u a l i o s { / / i n p u t stream c l a s s public : i s t r e a m& operator > >( char& c ) { c = bp−>sbumpc ( ) ; r e t u r n ∗ t h i s ; } }; class ostream : public v i r t u a l i o s { / / o u t p u t stream c l a s s public : ostream& operator < <( char c ) { bp−>s p u t c ( c ) ; r e t u r n ∗ t h i s ; } }; class i o s t r e a m : public i s t r e a m , public ostream { } ; Izsó Tamás
Származtatatás/ 38
osztályok kapcsolata
class filebuf, fstreambase class f i l e b u f : public streambuf { / / a streambuf f o r f i l e s int fd ; void o v e r f l o w ( i n t ) ; void u n d e r f l o w ( ) ; void seek ( long o f f s e t , i n t whence ) ; void f l u s h ( ) { i f ( i s _ w r i t i n g ) w r i t e ( fd , buf , x _ p p t r −b u f ) ; } f i l e b u f ( const char ∗name , i n t om ) ; ~filebuf () ; };
class fstreambase : v i r t u a l public i o s { protected : fstreambase ( ) { } public : / / t h e member streambuf : : bp i s here known t o p o i n t t o a f i l e b u f void seek ( long o f f s e t , i n t whence ) { ( ( f i l e b u f ∗ ) bp)−>seek ( o f f s e t , whence ) ; } }; Izsó Tamás
Származtatatás/ 39
osztályok kapcsolata
file stream-ek class i f s t r e a m : public fstreambase , public i s t r e a m { public : i f s t r e a m ( const char ∗ name ) : i o s (new f i l e b u f ( name , i o s : : i n ) ) {} }; class o f s t r e a m : public fstreambase , public ostream { public : o f s t r e a m ( const char ∗ name ) : i o s (new f i l e b u f ( name , i o s : : o u t ) ) {} }; class f s t r e a m : public fstreambase , public i o s t r e a m { public : f s t r e a m ( const char ∗ name ) : i o s (new f i l e b u f ( name , i o s : : i n | i o s : : o u t ) ) {} }; Izsó Tamás
Származtatatás/ 40
osztályok kapcsolata
Pufferelt írás
ostream& ostream : : operator < <( char c ) { bp−>s p u t c ( c ) ; return ∗ this ; } void streambuf : : s p u t c ( i n t c ) { / / p u t a c h a r a c t e r i f ( x _ p p t r >= &b u f [ b u f s i z ] ) o v e r f l o w ( c ) ; else ∗ x _ p p t r ++ = c ; } void f i l e b u f : : o v e r f l o w ( i n t c ) { flush () ; i s _ w r i t i n g = true ; x_pptr = buf ; x _ g p t r = &b u f [ b u f s i z ] ; sputc ( c ) ; } void f i l e b u f : : f l u s h ( ) { i f ( i s _ w r i t i n g ) w r i t e ( fd , buf , x _ p p t r −b u f ) ; }
Izsó Tamás
Származtatatás/ 41
osztályok kapcsolata
filebuf konstruktor és destruktor f i l e b u f : : f i l e b u f ( const char ∗name , i n t om) { switch (om) { case i o s : : i n : f d = open ( name , O_RDONLY) ; break ; case i o s : : o u t : f d = c r e a t ( name , 0666) ; break ; case i o s : : i n | i o s : : o u t : f d = open ( name , O_RDWR | O_CREAT, 0 6 6 6 ) ; break ; } }
filebuf :: ~filebuf () { flush () ; close ( fd ) ; }
Izsó Tamás
Származtatatás/ 42
osztályok kapcsolata
Hallgatói C++ modell Az évfolyamot hallgatók alkotják. A hallgatók különbözo˝ tantárgyakat vesznek fel. A hallgatók kiszh-kat írnak, és az év végén ezek alapján kapják az érdemjegyet. Funkciók: tárgy felvétele óra látogatása következo˝ kiszh megírása ZH-n elért eredmény lekérdezése hallgatói átlag lekérdezése
Izsó Tamás
Származtatatás/ 43
osztályok kapcsolata
Elso˝ modell
Izsó Tamás
Származtatatás/ 44
osztályok kapcsolata
Hallgatói modell finomítása
˝ Szereplok: évfolyam hallgató tantárgy felvett tantárgy kiszh eredmények kiszh feladatok
Izsó Tamás
Származtatatás/ 45
osztályok kapcsolata
Évfolyam
Attribútum: Hallgatók halmaza Metódusok: felvesz egy hallgatót töröl egy hallgatót listáz
Izsó Tamás
Származtatatás/ 46
osztályok kapcsolata
Hallgató Attribútum: név neptun kód felvett tantárgyak Metódusok: név lekérdezés neptun kód lekérdezés tantárgy felvétel orára jár kiszh-t ír egy tantárgyból írt kzh-k számának a lekérdezés kiszh eredmények lekérdezése átlagszámítás Izsó Tamás
Származtatatás/ 47
osztályok kapcsolata
Tantárgy Attribútum: kód kredit kiszh feladatok Metódusok: kód lekérdezés kredit lekérdezés követelmények közlése kiszh íratás jegy kiszámítás
Izsó Tamás
Származtatatás/ 48
osztályok kapcsolata
Felvett tantárgy Attribútum: hallgató tantárgy jelenlét megírt kiszh-k Metódusok: tantárgy lekérdezés hallgató lekérdezés jelenlét lekérdezés kiszh eredmény lekérdezése kiszh íratás jegy kiszámítás Izsó Tamás
Származtatatás/ 49
osztályok kapcsolata
Kiszh eredmény
Attribútum: kiszh sorszáma pont dátum Metódusok: pont lekérdezés sorszám lekérdezés dátum lekérdezés
Izsó Tamás
Származtatatás/ 50
osztályok kapcsolata
Kiszh feladat
Attribútum: megoldandó feladat Metódusok: feladatok lekérése
Izsó Tamás
Származtatatás/ 51
osztályok kapcsolata
Második modell Evfolyam
1..3
- hallg:Hallgato*[10000] + felvesz(Hallgato&) : void + torol(const String&) : void + list() const : void
* Hallgató
TanTargy
- neptun:String - kod:String
- nev:String - targyak:FelvTargy[TARGYAK_N] + getNev() const : String + getNeptun() const : String + felvesz(const Tantargy& ) : bool + kzhIr(const String& ) : void + getZhPont(const String&, int ) const : double + getAtlag() const : double + oratLatogat( const String& ) : void
- kredit:int - feladat: ZhFeladat[ZHF_N]
1 + getKod() const : String 1
*
*
+ getKredit() const : int + kovetelmenyek() const : String + kzhIr(const String&, int) const : KisZhEredm - javit() const : double
FelvTargy - hallg:const Hallgato * - targy:const TanTargy * - jelenlet:int - kzhDb:int - kzh KisZhEredm[KZH_N] + getKod() const : String + getZhPont(int nr) const : double + oratLatogat() : void + kzhIr() : void + getJegy() const : int
Izsó Tamás
1
*
KisZhEredm - kzh:int - pont: double - datum: Time + getPont() const : double + getNr() const : int + getTime() const : Time
Származtatatás/ 52
1
*
ZhFeladat - szöveg:String + Feladat() : String
osztályok kapcsolata
Kiszh írás void H a l l g a t o : : k z h I r ( const S t r i n g & t a r g y k o d ) { / / megkeressuk a f e l v e t t t a r g y a k k o z u l : int i ; f o r ( i =0; i
=KZH_N) throw "Nem t u d tobb ZH−t i r n i ! " ; KisZhEredm zh = t a r g y −>k z h I r ( h a l l g −>getNeptun ( ) , kzhDb+1 ) ; kzh [ kzhDb ] = zh ; kzhDb ++; } KisZhEredm Tantargy : : k z h I r ( const S t r i n g & neptun , i n t n r ) const { double pont = j a v i t ( n r ) ; t i m e _ t t ; t i m e (& t ) ; / / datum : S t r i n g datum ( c t i m e (& t ) ) ; KisZhEredm zh ( nr , pont , datum ) ; r e t u r n zh ; } Izsó Tamás
Származtatatás/ 53