Ласло Краус |
СИ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.