Jak rzucić couta, żeby został on przechwycony przez blok:
catch (std::ostream& OStrm) {
cout << "Obsluga: 1" << endl;
}
???
Jak rzucić couta, żeby został on przechwycony przez blok:
catch (std::ostream& OStrm) {
cout << "Obsluga: 1" << endl;
}
???
try {
throw &cout;
}
catch (std::ostream *OStrm) {
(*OStrm) << "Obsluga: 1" << endl;
}
Strasznie dziwne ... wręcz WTF. Raczej zrezygnuj z takich zabiegów. Dlaczego niby strumień miałby robić za wyjątek ? Wyjątki nie służą do implementacji logiki.
Wiem, że dziwne, ale nie za bardzo znam się na obsłudze wyjątków, a wiem, że na egzaminie z programowania obiektowego mogę mieć pytanie:
Niech bedzie dany nastepujacy fragment kodu
int main()
{
try {
throw std::cout;
}
catch (std::ostream& OStrm) {
cout << "Obsluga: 1" << endl;
}
catch (std::istream& OStrm) {
cout << "Obsluga: 2" << endl;
}
}
Czy prawda jest, ze ...
zapis jest niepoprawny, gdyz nie mozna zglaszac jako wyjatkow obiektow z biblioteki standardowej.
NIE?
zapis jest niepoprawny, gdyz strumieni nie mozna przekazywac
do metod poprzez wartosc.
NIE?
zapis jest niepoprawny, gdyz jako wyjatku nie mozna zglaszac
w jakiejkolwiek formie strumienia standardowego, tzn. bezposrednio
jako obiekt lub posrednio poprzez zmienne referencjna lub wskaznik.
TAK?
mozliwa jest modyfikacja zgloszenia obiektu std::cout bez wprowadzania dodatkowych definicji klas, tak aby ktoras z istniejacych sekcji "catch" przechwycila go.
NIE?
jj09 napisał(a)
Wiem, że dziwne, ale nie za bardzo znam się na obsłudze wyjątków, a wiem, że na egzaminie z programowania obiektowego mogę mieć pytanie:
Niech bedzie dany nastepujacy fragment kodu
int main()
{
try {
throw std::cout;
}
catch (std::ostream& OStrm) {
cout << "Obsluga: 1" << endl;
}
catch (std::istream& OStrm) {
cout << "Obsluga: 2" << endl;
}
}
Czy prawda jest, ze ...
zapis jest niepoprawny, gdyz nie mozna zglaszac jako wyjatkow obiektow z biblioteki standardowej.
NIE?zapis jest niepoprawny, gdyz strumieni nie mozna przekazywac
do metod poprzez wartosc.
NIE?zapis jest niepoprawny, gdyz jako wyjatku nie mozna zglaszac
w jakiejkolwiek formie strumienia standardowego, tzn. bezposrednio
jako obiekt lub posrednio poprzez zmienne referencjna lub wskaznik.
TAK?mozliwa jest modyfikacja zgloszenia obiektu std::cout bez wprowadzania dodatkowych definicji klas, tak aby ktoras z istniejacych sekcji "catch" przechwycila go.
NIE?
To jest niepoprawne bo strumieni nie można kopiować:
private: ios_base (const ios_base&); //konstruktor kopiujący w ios_base
1 - nie (można), 2 - tak, 3 - nie, 4 - jako wartość nie, jako adres - tak
#include <iostream>
int main()
{
try {
throw &std::cout;
}
catch (std::ostream *OStrm) {
std::cout << "Obsluga: 1" << std::endl;
}
catch (std::istream& OStrm) {
std::cout << "Obsluga: 2" << std::endl;
}
}
d:/kody $ g++ -o wtf.exe wtf.cpp
d:/kody $ ./wtf.exe
Obsluga: 1
dzięki bodziobudowniczy;)