Imię i nazwisko: . . . .
Grupa studencka: . . . czas: 60 min
Zadanie 1 (6pkt)
Napisz szablon funkcji wypisującej elementy kolekcji na podany strumień. Elementy rozdzielaj spacją.
template<typename T> void print(const T& kolekcja, std::ostream& os) {
}
Które instrukcje (wewnątrz szablonu print) tworzą obiekt iteratora?
a) class T::const_iterator it;
b) typename T::const_iterator it;
c) T::const_iterator it;
Które konkretyzacje szablonu print są prawidłowe?
a) std::vector<int> v; print<std::vector<int> >(v,std::cout);
b) std::vector<int> v; print<int>(v, std::cout);
c) std::vector<int> v; print(v, std::cout);
Zadanie 2(4pkt)
Dla klasy Okno dostarczono trzy warianty operatora przypisania:
class Bitmap { /* ... */ };
class Okno { /* ... */
private:
Bitmap* b;
};
Które warianty zapewniają bezpieczne przypisanie obiektu samego do siebie?
Które warianty zostawią obiekt w poprawnym stanie, zakładając, że konstruktor Bitmap zgłosi wyjątek?
Która implementacja operatora przypisa- nia jest najlepsza dla klasy Okno(uzasadnij)?
//Implementacja 1
Okno& operator=(const Okno& o) { Bitmap* old = b;
b = new Bitmap(*o.b);
delete old;
return *this;
}
//Implementacja 2
Okno& operator=(const Okno& o) { delete b;
b = new Bitmap(*o.b);
return *this;
}
//Implementacja 3
Okno& operator=(const Okno& o) { if(this == &o) return *this;
delete b;
b = new Bitmap(*o.b);
return *this;
}
Zadanie 3(3pkt)
Jaki problem rozwiązuje wzorzec wizytatora?
Zadanie 4(7pkt)
Klasa Czas reprezentuje czas jako liczba sekund i milisekund. Po- praw błędy (znajdź min. 14). Przykład użycia jest następujący:
Czas c1(0,1500), c2(1,500);
assert( c1 + c2 == Czas(3) );
class Czas {
static const int MILI = 1000;
public:
explicit Czas(int sec = 0, int msec) : msec_(msec) { sec_ += msec_ / MILI;
}
void operator+=( Czas c ) { msec_ += c.msec_;
sec_ += c.sec_;
}
void operator+( Czas c) const { Czas o(*this);
o += c;
}
bool operator==(Czas c) { msec_ == sec_; } std::ostream operator<<(std::ostream os) {
os << sec_ << ’.’ << std::setw(3) << std::setfill(’0’) << msec_;
return os;
} private:
int sec_;
int msec_;
};
Zadanie 5 (6pkt)
class MyExc : public std::exception { char c_;
public:
MyExc(char c) : c_(c) {}
char get() const { return c_; } };
void f(char c) { std::cout << c; throw MyExc(c); std::cout << c; } struct Res {
char c_;
Res(char c) : c_(c) { std::cout << c_; }
˜Res(){ std::cout << c_; } };
void g() { Res r1(’A’);
try {
Res r2(’B’);
f(’C’);
f(’D’);
} catch(std::exception&) { f(’E’);
} catch(MyExc& e) { std::cout << e.get();
} f(’F’);
}
• Podać napis, który zosta- nie wyświetlony po wykonaniu funkcji zad5:
void zad5() { try {
g();
} catch(MyExc& e) { std::cout << e.get();
} catch(...) { std::cout << ’M’;
}
std::cout << std::endl;
}
• Ile razy jest wołana funkcja f
• Ile razy jest wołany konstruk- tor klasy Res
Zadanie 6 (4pkt)
Podaj trzy zalety stosowania mechanizmu wyjątków do obsługi błędów w porównaniu ze zmienną globalną errno
1) 2)
3)