Ласло Краус |
СИ2ОО1 Други колоквијум 9. 12. 2010. |
---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Образложити шта је лоше у декларацији следеће операторске функције у класи X
: X& operator=(const X&) const;
б) Који начин извођења (јавно или приватно) се подразумева за изведене класе, односно изведене структуре?
в) Да ли је конверзија наниже (downcast) безбедна и зашто?
Саставити на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа; у случају грешке прекидати програм):
it<<tekst
).
paragraf+=znak
). Додавање знака преласка у наредни ред затвара параграф, односно више му се не могу додавати знаци. Повратна вредност је индикатор да ли је додавање успело. Дужина је одређена бројем знакова. У излазни ток се пишу сви садржани знакови, укључујући прелазак у нови ред.
odeljak+=paragraf
). Дужина је одређена збиром броја знакова у наслову и дужином садржаних параграфа. У излазном току се пре и после наслова прави по један проред, па се упишу садржани параграфи.
(10 поена) Написати на језику C++ програм који направи један одељак са неколико параграфа, а затим га испише на стандардном излазу. Користити фиксне параметре (није потребно учитавати податке с главног улаза).
#include <iostream> #include <cstring> #include <typeinfo> using namespace std; class Tekst { virtual void pisi( ostream& it) const =0; public: virtual ~Tekst() {} virtual int duzina() const =0; virtual Tekst* kopija() const =0; friend ostream& operator<<( ostream& it, const Tekst& t) { t.pisi( it); return it; } }; class Paragraf: public Tekst { char* niz; int kap, kor, duz; bool gotov; void pisi( ostream& it) const { it << niz; } void kopiraj( const Paragraf& p); void brisi() { delete [] niz; } public: Paragraf( int kkap, int kkor) { niz = new char [kap = kkap]; kor = kkor; duz = 0; gotov = false; niz[0] = '\0'; } Paragraf( const Paragraf& p) {kopiraj(p);} ~Paragraf() { brisi(); } Paragraf& operator=( const Paragraf& p) { if (this != &p) { brisi(); kopiraj( p); } return *this; } int duzina() const { return duz; } Paragraf* kopija() const { return new Paragraf( *this); } bool operator+= char c); }; void Paragraf::kopiraj( const Paragraf& p) { niz = new char [kap = p.kap]; strcpy( niz, p.niz); kor = p.kor; duz = p.duz; gotov = p.gotov; } bool Paragraf::operator+=( char c) { if (gotov) return false; if (duz == kap-1) { char* pom = new char [kap += kor]; strcpy( pom, niz); delete [] niz; niz = pom; } niz[duz++] = c; niz[duz] = '\0'; gotov = c == '\n'; return true; } class Odeljak: public Tekst { char* nasl; struct Elem { Paragraf par; Elem* sled; Elem( const Paragraf& p): par( p) { sled = 0; } }; Elem *prvi, *posl; void pisi( ostream& it) const; void kopiraj( const Odeljak& odl); void brisi(); public: Odeljak( const char* nsl) { nasl = new char [strlen(nsl)+1]; strcpy( nasl, nsl); prvi = posl = 0; } Odeljak( const Odeljak& odl){ kopiraj( odl); } ~Odeljak() { brisi(); } Odeljak& operator=( const Odeljak& odl) { if (this != &odl){ brisi(); kopiraj( odl); } return *this; } int duzina() const; Odeljak* kopija() const{ return new Odeljak( *this); } Odeljak& operator+=( const Paragraf& par); }; void Odeljak::pisi( ostream& it) const { it << endl << nasl << "\n\n"; for (Elem* tek=prvi; tek; tek=tek->sled) it << tek->par; } void Odeljak::kopiraj( const Odeljak& odl) { nasl = new char [strlen(odl.nasl) + 1]; strcpy( nasl, odl.nasl); prvi = posl = 0; for (Elem* tek = odl.prvi; tek; tek=tek->sled) { Elem* novi = new Elem( tek->par); posl = (!prvi?prvi:posl->sled) = novi; } } void Odeljak::brisi() { delete [] nasl; while (prvi) { Elem* stari = prvi; prvi = prvi->sled; delete stari; } } int Odeljak::duzina() const { int d = strlen( nasl); for (Elem* tek=prvi; tek; tek=tek->sled) d += tek->par.duzina(); return d; } Odeljak& Odeljak::operator+=( const Paragraf& par) { Elem* novi = new Elem( par); posl = (!prvi ? prvi : posl->sled) = novi; return *this; } int main () { char* tks[] = { "prvi paragraf\n", "drugi paragraf\n", "treci paragraf\n","cetvrti paragraf\n", "" }; Odeljak roman( "Naslov odeljka"); for (int i=0; tks[i][0]!='\0'; i++) { Paragraf p( 5, 3); for (int j=0; j<strlen(tks[i]); j++) p += tks[i][j]; roman += p; } cout << roman; return 0; }(⇒ почетак)
Naslov odeljka prvi paragraf drugi paragraf treci paragraf cetvrti paragraf
Copyright © 2011, Laslo Kraus
Последња ревизија: 25.10.2011.