[Mat08] info4

Berta Nánássi nberta at math.bme.hu
2011. Ápr. 7., Cs, 08:00:38 CEST


Sziasztok!

A próbazh első részének megoldásai. a többit is küldöm nemsokára.

Berta
--------- következő rész ---------
Egy csatolt HTML állomány át lett konvertálva...
URL: http://lists.math.bme.hu/pipermail/mat08/attachments/20110407/aa19a73d/attachment.htm 
--------- következő rész ---------
h.1 Az yylex deklaracioja extern, mit jelent ez

Az extern megmondja a forditonak, h az adott dolog mashol lett deklaralva. Tehat az yylex fv maga az etc6p.cxx-ben van megvalositva, viszont mas cxx-ekbol is elerhetove valik ha beincludeolod az etc6p.hxx-et.

h.2 A Token osztaly konstruktora protected, mit jelent ez

A protected miatt nem peldanyosithato a Token osztaly. A konstruktoroknak peldanyositashoz mindig publicnak kell lenniuk. Mivel a konstruktor protected, ezert a Token osztaly szarmaztatasaval csinalhatsz egy masik osztalyt, ami felulcsapja a protected konstruktort public-kal, igy a szarmaztatott osztaly mar peldanyosithato lesz. Erre pelda a cpp6p.hxx fajlban a Num,Con,Fun,Var osztalyok, amik mar mind public konstruktorral rendelkeznek, igy ezek mar peldanyosithatoak.

h.3 A char const  tipus eseten MI az, ami konstansnak van deklaralva

Ugyanaz, mint a const char . Ez a ket forma azt jeloli h a mutatott karaktersorozat a konstans, nem pedig maga a mutato. Tehat a mutaton tudsz valtoztatni, de a mutatott ertekeken mar nem.

h.4 A Cmd osztaly type tagjanak erteke milyen ertekkeszletbol valo

Az enumok nevesitett szamok, azaz az elso elem alapbol nullanak van megfeleltetve, az osszes tobbi elem pedig az elozo+1-el egyenerteku. 6 elem eseten az EK [0,5].

h.5 A Cmd osztaly type tagja privat, akkor miert nem folosleges az, hogy az e_type tag viszont publikus

A type osztalyvaltozo, mig az e_type tipus. A type-ot igy csak osztalyon belul hasznalhatod, az e_type tipust viszont osztalyon kivul is.

h.6 Sorolja fel a Cmd osztaly osszes fuggveny tagjat es adattagjat! Van-e masmilyen tag meg ezeken kivul

fv konstruktor, eval_print
adat type
tipus e_type

h.7 Cmd, Num, Con, Fun, Var, ... ezek mind tokenek. Rendjen valo az, mire valo az, hogy ugyan ezek tobbsegenel van eval tagfuggveny, de van ahol nincs es helyette eval_print van, es van ahol pedig asgn is van Hogy lehet az, hogy a tokenek nem egyformak a lehetseges tagfuggvenyek osszessegeben

Hat a tokenek kifejezes itt szerintem felrevezeto. A tokeneket a Token osztalyra erti, h abbol szarmaztatottak. A szarmaztatassal te csak felhasznalod a Token osztalyban deklaralt dolgokat. Kiegeszitheted, felulirhatod a Token cuccait az adott osztalyban. Van amelyik eval-lal egesziti ki, van amelyik eval_print-tel, van amelyik asgn metodussal, kinek mi kellett... A szarmaztatas lenyege h mindig az eltereseket definialjuk a szarmaztatott osztalyhoz kepest. Ha egyforma lenne minden az adott osztalyokban, akkor nem kene szarmaztatni, vagy nem kene a sok kulonbozo osztaly, mert ertelmet veszti az egesz.

h.8 Mit is jelent az, hogy egy tagfuggveny virtualis Ennek igazan erzekelheto ertelme milyen helyzetben van

 Ha egy tagfvmetodus virtualis, akkor az adott osztaly leszarmazottaiban is virtualis marad.  A szarmaztatott virtualis metodusok visszateresi erteke meg kell h egyezzen az ososztalybeli virtualis metodus visszateresi ertekevel.
 Hasznalataval elerheto a polimorfizmus.
 A virtualis metodus mukodese a legrovidebben megvalositja a Late Binding-ot   Kicsit hosszabban
Ha csinalsz egy osztalyra(pl. A osztaly) mutato pointert, ami egy, az A osztalybol leszarmaztatott osztaly (legyen B osztaly) peldanyarara mutat, akkor az alabbiak lesznek igazak

Ha ezen a mutaton keresztul hivsz meg egy virtualis metodust, akkor mindig a szarmaztatott osztalybeli(B) metodust hajtodik vegre, amennyiben van. Ha nincs a szarmaztatott osztalyban(B) felulirva a virtualis metodus, akkor az A osztalybeli verzio fog lefutni.
Ha a hivott metodus nem virtualis, akkor mindig az A osztalybeli verzio fut le.

Bovebb info koddal httpmsdn.microsoft.comen-uslibrary0y01k918(v=vs.71).aspx httpen.wikipedia.orgwikiVirtual_function

h.9 Mi ertelme van virtualis destruktor hasznalatanak, mikor szukseges

Az elozo peldaban vett dolgok a destruktorokra is igazak. Ha a destruktor nem virtualis, akkor csak az A osztalybeli verzio fog lefutni, ha virtualis, akkor elobb a B destruktora, aztan az A-e. Azert kell hasznalni h az Apokalipszis kapui ne nyiljanak meg 

h.10 Miert protected az ExprInfix konstruktora Miert celszeru, hogy a larg, ostr es rarg tagjai is protected-ek legyenek

Mert igy az ExprInfix nem peldanyosithato, ezert szarmaztatni kell belole egy osztalyt(pl. ExprAdd), ami a public konstruktora miatt mar peldanyosithato lesz.
A larg,ostr.... stb az egysegbezaras elve miatt protected.

h.11 Miert cim szerint veszik at az egyes lehetseges kifejezeseket megtestesito osztalyok konstruktorai a szukseges reszkifejezeseket, es miert nem ertek szerint (a C++ nyelv milyen lehetosege valik hozzaferhetove a cim szerinti atvetel miatt Es ez miert nagyon jo itt)

Mert ezek a parameterek objektumokat jelolnek, amikbol minden peldanyositaskor letrejonne egy masolat. A masolatokon vegrehajtott ertek valtozasok nem eredmenyezik az eredeti peldany valtozasat. Mutatokenti atadassal viszont nem jon letre uj peldany, a valtozasok(ha vannak) az eredeti peldanyon hajtodnak vegre es elerhetove valik a Late Binding a virtualis fv-ek hasznalata miatt.

h.12 Melyek az ExprPow tagfuggvenyei

Konstruktor es eval, valamint orokolt par metodust az ExprInfix-bol es az Exp-bol.

h.13 Van tty tagfuggvenye az ExprInfix-nek, akkor miert nincs az ExprUnary-nak

Az ExprUnary nem peldanyosithato, mert protected konstruktora van, ezert felesleges a virtualis metodusokat megvalositani ebben az osztalyban.

h.14 Mellesleg, miert tty-nek hivom a tagfuggvenyt, es miert nem tty()-nek

Ezt nem teljesen ertem.

h.15 Az Stms deklaracioja elott mit jelent a class Stmt; igy onmagaban; es miert van ra szukseg Milyen helyzetekben szuksegszeru az ilyesmi

Ez egy nem befejezett osztaly deklaraciot jelol. Azert van ra szukseg, mert az Stms osztaly hasznalja az Stmt-t, ami viszont az Stms utan lett deklaralva. Ilyen modon az Stms elott lett deklaralva az Stmt, kozben meg megsem.

h.16 Az Stms mennyivel tud tobbet az stdlistStmt  tipusnal Egyaltalan mi is ez utobbi tipus

eval_print es tty metodusokkal. Az stdlist egy ketszeresen lancolt listat valosit meg.

h.17 Miben kulonbozik egymastol az Stms es az Imid, persze a nevukon kivul

Stms Stmt-bol csinal listat, Imid az Ibegbol.

h.18 Milyen bajt okozna, ha az Stmt destruktora nem volna virtualis (h.9)

Akkor csak az Stmt destruktora hajtodna vegre es megnyilnanak az Apokalipszis kapui.

h.19 Stmt es leszarmazottjainal szerepel eval_print, illetve az egyik tokennel is, a Cmd-nel is. Mire jo ez igy

Teljesen mas az emlitett osztalyok felhasznalasa.

h.20 Az StmtIf-nel latunk ibeg, imid es iend adattagot. Egy 4 darab elif-et tartalmazo if-szerkezetnel hova lesz eltarolva az 1+4+1 felteteles blokk

ibeg 1
imid 4
iend 1

h.21 Sorolja fel a StmtDowhile adattagjait, tagfuggvenyeit, es van-e egyeb tag

adat nincs
metodus once_more,loopname,konstruktor
egyeb minden amit a StmtDoloop-tol orokolt

h.22 Az StmtDoloop-ban miert virtualis once_more es loopname, es miert protected a body es cond

A once_more es loopname a Late Binding hasznalata miatt virtualisak.
A body es cond adattagok, amik az egyegbezaras miatt protectedek.

h.23 StmtDoloop konstruktora publikus, ... lehet ilyen tipusu objektumot letrehozni Konkretan a programunknak nincs szuksege ilyen tipusu onallo objektumra. Lefordithato es helyesen mukodo lenne-e az, ha a konstruktort protected vedelem ala helyeznenk

Igen.
Nem, akkor a szarmaztatott osztalyokban kene publikus konstruktort csinalni.

h.24 Milyen bajt okozna, ha a ~StmtDoloop destruktortol is megvonnank a publikussagot Analog kerdes szinte minden mas osztalyunk kapcsan felvetheto. Miert

Nem lenne torolheto a peldany.


More information about the Mat08 mailing list