You are on page 1of 12

Universidade Federal do Rio Grande do Norte

Instituto Metrpole Digital


IMD0030 Linguagem de Programao I - T3
Docente: Umberto S. Costa

Problema: desenvolvimento de habilidades de programao na linguagem C++.

Subproblema 8: criao de namespaces e bibliotecas, manipulao de excees.

Produto do subproblema: (i) resumo das principais caractersticas e recursos C++ identificados
durante a explorao das questes deste subproblema (at duas pginas, podendo haver apndices);
(ii) respostas s questes abaixo; e (iii) cdigo-fonte dos programas implementados.

Data de entrega via SIGAA: 22 de novembro de 2016.

Instrues: neste problema o aluno deve consultar as referncias indicadas pelo docente para se
familiarizar com os recursos necessrios criao de programas C++, sem prejuzo consulta de
outras fontes como manuais e tutoriais. Usar as questes e programas mostrados a seguir como
guia para as discusses em grupo e para orientar a explorao da linguagem C++. Para facilitar o
aprendizado, recomenda-se que o aluno compare os recursos e conceitos de C++ com seu conheci-
mento prvio acerca de outras linguagens de programao. Leia e modifique os cdigos mostrados e
utilize os conceitos e recursos explorados para a criar os programas solicitados. Recursos exclusivos
da linguagem C devem ser ignorados e substitudos por seus correspondentes em C++.

Questes1 :

1. A listagem abaixo mostra a utilizao de membros de dados estticos na implementao de


um gerador de identificadores. Para gerar cada identificador, este gerador utiliza um prefixo e
um contador serial. Como esta listagem tem por objetivo inicial apenas mostrar membros de
dados estticos, o prefixo foi simplificado e sempre inicializado com o valor 1.
1 #i n c l u d e <i o s t r e a m >
2
3 c l a s s generate_id {
4 public :
5 g e n e r a t e _ i d ( ) : counter_ {0} {}
1
Em parte inspiradas em Exploring C++ 11, Ray Lischner. Alguns programas foram retirados desta mesma fonte.

1
6 l o n g next ( ) ;
7 private :
8 s h o r t counter_ ;
9 s t a t i c short prefix_ ;
10 s t a t i c s h o r t c o n s t max_counter_ { 3 2 7 6 7 } ;
11 };
12
13 short generate_id : : prefix_ {1};
14 s h o r t c o n s t g e n e r a t e _ i d : : max_counter_ ;
15
16 l o n g g e n e r a t e _ i d : : next ( ) {
17 i f ( counter_ == max_counter_ )
18 counter_ = 0 ;
19 else
20 ++counter_ ;
21 r e t u r n s t a t i c _ c a s t <long >( p r e f i x _ ) ( max_counter_ + 1 ) + counter_ ;
22 }
23
24 i n t main ( ) {
25 g e n e r a t e _ i d gen ; // C r e a t e an ID g e n e r a t o r
26 f o r ( i n t i { 0 } ; i != 1 0 ; ++i )
27 s t d : : c o u t << gen . next ( ) << s t d : : e n d l ;
28 }

lists/list4009.cpp

Pede-se:
(a) As linhas 9 e 10 definem os membros de dados estticos da classe generate_id. Quando
estes membros de dados so alocados e desalocados? Consulte a bibliografia recomendada.
(b) O que as linhas 13 e 14 demonstram sobre a qualificao de acesso e inicializao de mem-
bros estticos? Teremos verses individuais dos membros estticos em objetos generate_id?
Podemos comentar a linha 14 sem modificar o comportamento desta implementao?
2. Em C++ podemos definir qualquer funo ou objeto global em qualquer arquivo-fonte. Cada
arquivo-fonte pode ser compilado em um arquivo-objeto separadamente, desde que informemos
ao compilador onde os nomes referenciados esto declarados. Estes arquivos objetos podem ser
linkados posteriormente, desde que o linkeditor possa encontrar uma definio para cada nome
referenciado. Abaixo, reescrevemos a listagem list4009.cpp definindo a classe generate_id
no arquivo generate_id.cpp e o programa principal no arquivo main.cpp.
1 c l a s s generate_id {
2 public :
3 g e n e r a t e _ i d ( ) : counter_ {0} {}
4 l o n g next ( ) ;
5 private :
6 s h o r t counter_ ;
7 s t a t i c short prefix_ ;
8 s t a t i c s h o r t c o n s t max_counter_ { 3 2 7 6 7 } ;
9 };
10
11 short generate_id : : prefix_ {1};
12 s h o r t c o n s t g e n e r a t e _ i d : : max_counter_ ;

2
13
14 l o n g g e n e r a t e _ i d : : next ( ) {
15 i f ( counter_ == max_counter_ )
16 counter_ = 0 ;
17 else
18 ++counter_ ;
19 r e t u r n s t a t i c _ c a s t <long >( p r e f i x _ ) ( max_counter_ + 1 ) + counter_ ;
20 }

lists/q02/generate_id.cpp

Podemos compilar generate_id.cpp, mas no link-lo pois precisamos da funo main.


1 #i n c l u d e <i o s t r e a m >
2
3 c l a s s generate_id {
4 public :
5 g e n e r a t e _ i d ( ) : counter_ {0} {}
6 l o n g next ( ) ;
7 private :
8 s h o r t counter_ ;
9 s t a t i c short prefix_ ;
10 s t a t i c s h o r t c o n s t max_counter_ { 3 2 7 6 7 } ;
11 };
12
13 i n t main ( ) {
14 g e n e r a t e _ i d gen ; // C r e a t e an ID g e n e r a t o r
15 f o r ( i n t i { 0 } ; i != 1 0 ; ++i )
16 s t d : : c o u t << gen . next ( ) << s t d : : e n d l ;
17 }

lists/q02/main.cpp

Como main utiliza a classe generate_id, seu arquivo precisa da definio da classe generate_id.
Pede-se:
(a) Compile (sem linkar) o arquivo generate_id.cpp utilizando o seguinte comando:
g++ -pedantic -std=c++11 -c generate_id.cpp
Qual arquivo foi gerado?
(b) Compile (sem linkar) o arquivo main.cpp utilizando o seguinte comando:
g++ -pedantic -std=c++11 -c main.cpp
Qual arquivo foi gerado?
(c) Linke os arquivos objeto gerados nos itens anteriores utilizando o seguinte comando:
g++ -pedantic -std=c++11 main.o generate_id.o -o main
O executvel gerado tem o mesmo comportamento do programa list4009?
(d) Substitua os passos descritos nos itens (b) e (c) pelo comando abaixo:
g++ -pedantic -std=c++11 main.cpp -o main generate_id.o
O executvel gerado tem o mesmo comportamento do programa list4009?
(e) Crie um arquivo makefile para seus programas. Consulte esta referncia aqui.

3
(f) Note que ambos os arquivos-fonte contm uma definio idntica da classe generate_id. O
que acontecer se a definio mudar apenas em um destes arquivos? Para testar, renomeie
o mtodo next() como next_id() em main.cpp (linhas 6 e 16) e tente recompilar.
3. Lembrando que o compilador precisa apenas da declarao dos objetos globais referenciados
para criar os cdigos-objeto, podemos evitar os problemas associados ao item (f) da questo
anterior colocando a declarao destes objetos em um arquivo parte e, ento, utilizar a diretiva
#include para incluir estas declaraes em cada arquivo-fonte que precisa destas declaraes.
Desta forma, garantimos que o compilador sempre ver a mesma declarao, independente de
qual cdigo-fonte est sendo considerado. Arquivos de cabealho so utilizados para armazenar
as declaraes comuns a diversos arquivos-fonte e, por conveno, utilizam as extenses .h,
.hh, .hxx ou .hpp. Daqui em diante, utilizaremos a extenso .hpp para arquivos de cabealho.
A seguir, veja a nova estruturao dos cdigos mostrados na questo anterior:
1 // C l a s s f o r g e n e r a t i n g a u n i q u e ID number .
2 c l a s s generate_id {
3 public :
4 g e n e r a t e _ i d ( ) : counter_ {0} {}
5 l o n g next ( ) ;
6 private :
7 s h o r t counter_ ;
8 s t a t i c short prefix_ ;
9 s t a t i c s h o r t c o n s t max_counter_ { 3 2 7 6 7 } ;
10 };

lists/q03/generate_id.hpp

1 #i n c l u d e " g e n e r a t e _ i d . hpp"
2
3 short generate_id : : prefix_ {1};
4 s h o r t c o n s t g e n e r a t e _ i d : : max_counter_ ;
5
6 l o n g g e n e r a t e _ i d : : next ( ) {
7 i f ( counter_ == max_counter_ )
8 counter_ = 0 ;
9 else
10 ++counter_ ;
11 r e t u r n s t a t i c _ c a s t <long >( p r e f i x _ ) ( max_counter_ + 1 ) + counter_ ;
12 }

lists/q03/generate_id.cpp

1 #i n c l u d e <i o s t r e a m >
2 #i n c l u d e " g e n e r a t e _ i d . hpp"
3
4 i n t main ( ) {
5 g e n e r a t e _ i d gen ; // C r e a t e an ID g e n e r a t o r
6 f o r ( i n t i { 0 } ; i != 1 0 ; ++i )
7 s t d : : c o u t << gen . next ( ) << s t d : : e n d l ;
8 }

lists/q03/main.cpp

4
Pede-se:
(a) Note a diferena entre as incluses de bibliotecas padro e do usurio (linha 1 de generate_id.cpp
e linha 2 de main.cpp). Qual o tratamento dado pelo compilador nestes casos?
(b) Podemos utilizar o mesmo arquivo makefile para gerar o executvel?
(c) Verifique se o novo programa preserva o comportamento da verso original.
(d) Crie um atributo privado std::string useless_{} em generate_id.hpp para demonstrar
que um arquivo de cabealho pode ter suas prprias diretivas de incluso.
(e) O que acontecer se um arquivo de cabealho for includo mais de uma vez, mesmo que
indiretamente por meio de outras incluses, por um mesmo arquivo fonte?
4. Para assegurar que o compilador veja apenas uma vez a declarao de objetos globais, ainda
que um mesmo arquivo-fonte inclua seu cabealho mais que uma vez, devemos utilizar dire-
tivas adicionais. Para isso, escolha um nome para identificar inequivocamente seu arquivo de
cabealho e utilize este nome para controlar a compilao. Veja o exemplo a seguir:
1 #i f n d e f GENERATE_ID_HPP_
2 #d e f i n e GENERATE_ID_HPP_
3
4 // C l a s s f o r g e n e r a t i n g a u n i q u e ID number .
5 c l a s s generate_id {
6 public :
7 g e n e r a t e _ i d ( ) : counter_ {0} {}
8 l o n g next ( ) ;
9 private :
10 s h o r t counter_ ;
11 s t a t i c short prefix_ ;
12 s t a t i c s h o r t c o n s t max_counter_ { 3 2 7 6 7 } ;
13 };
14
15 #e n d i f

lists/q04/generate_id.hpp

Explique o funcionamento destas diretivas.


5. Considere as seguintes listagens, com anotaes Doxygen:
1 #i f n d e f VITAL_STATS_HPP_
2 #d e f i n e VITAL_STATS_HPP_
3
4 #i n c l u d e <i o s f w d >
5 #i n c l u d e <s t r i n g >
6
7 class vital_stats {
8 public :
9 // / C o n s t r u c t o r . I n i t i a l i z e e v e r y t h i n g t o z e r o or o t h e r " empty " v a l u e .
10 v i t a l _ s t a t s ( ) : height_ { 0 } , weight_ { 0 } , bmi_{ 0 } , sex_ { ? } , name_{}
11 {}
12 // / Get t h i s r e c o r d , o v e r w r i t i n g t h e d a t a members .
13 // / Errorc h e c k i n g o m i t t e d f o r b r e v i t y .
14 // / @param i n t h e i n p u t stream
15 // / @param num a s e r i a l number , f o r u s e when prompting t h e u s e r

5
16 // / @return t r u e f o r s u c c e s s or f a l s e f o r e o f or i n p u t f a i l u r e
17 b o o l r e a d ( s t d : : i s t r e a m& in , i n t num ) ;
18 // / P r i n t t h i s r e c o r d t o @p o u t .
19 // / @param o u t t h e o u t p u t stream
20 // / @param t h r e s h o l d mark r e c o r d s t h a t have a BMI >= t h i s t h r e s h o l d
21 v o i d p r i n t ( s t d : : ostream& out , i n t t h r e s h o l d ) c o n s t ;
22 // / Return t h e BMI .
23 i n t bmi ( ) c o n s t { r e t u r n bmi_ ; }
24 // / Return t h e h e i g h t i n c e n t i m e t e r s .
25 i n t h e i g h t ( ) c o n s t { r e t u r n height_ ; }
26 // / Return t h e w e i g h t i n k i l o g r a m s .
27 i n t w e i g h t ( ) c o n s t { r e t u r n weight_ ; }
28 // / Return t h e s e x : M f o r male or F f o r f e m a l e
29 c h a r s e x ( ) c o n s t { r e t u r n sex_ ; }
30 // / Return t h e p e r s o n s name .
31 s t d : : s t r i n g c o n s t& name ( ) c o n s t { r e t u r n name_ ; }
32 p r i v a t e :
33 // / Return BMI, b a s e d on h e i g h t _ and weight_
34 // / This i s c a l l e d o n l y from r e a d ( ) .
35 i n t compute_bmi ( ) c o n s t ;
36 i n t height_ ;
37 i n t weight_ ;
38 i n t bmi_ ;
39 c h a r sex_ ;
40 s t d : : s t r i n g name_ ;
41 ///< h e i g h t i n c e n t i m e t e r s
42 ///< w e i g h t i n k i l o g r a m s
43 ///< Bodymass i n d e x
44 ///< M f o r male or F f o r f e m a l e
45 ///< Person s name
46 } ;
47
48 #e n d i f

lists/q05/vital_stats.hpp

1 #i n c l u d e <iomanip>
2 #i n c l u d e <i o s t r e a m >
3 #i n c l u d e <l i m i t s >
4 #i n c l u d e <l o c a l e >
5 #i n c l u d e <s t r i n g >
6
7 #i n c l u d e " v i t a l _ s t a t s . hpp"
8
9 // / S k i p t h e r e s t o f t h e i n p u t l i n e .
10 // / @param i n t h e i n p u t stream
11 v o i d s k i p _ l i n e ( s t d : : i s t r e a m& i n ) {
12 i n . i g n o r e ( s t d : : n u m e r i c _ l i m i t s <i n t > : : max ( ) , \n ) ;
13 }
14
15 i n t v i t a l _ s t a t s : : compute_bmi ( )
16 const {
17 r e t u r n s t a t i c _ c a s t <i n t >(weight_ 10000 / ( height_ height_ ) + 0 . 5 ) ;

6
18 }
19
20 b o o l v i t a l _ s t a t s : : r e a d ( s t d : : i s t r e a m& in , i n t num) {
21 s t d : : c o u t << "Name " << num << " : " ;
22 i f ( not s t d : : g e t l i n e ( in , name_ ) )
23 return f a l s e ;
24 s t d : : c o u t << " H eigh t (cm ) : " ;
25 i f ( not ( i n >> height_ ) )
26 return f a l s e ;
27 skip_line ( in ) ;
28 s t d : : c o u t << " Weight ( kg ) : " ;
29 i f ( not ( i n >> weight_ ) )
30 return f a l s e ;
31 skip_line ( in ) ;
32 s t d : : c o u t << " Sex (M o r F ) : " ;
33 i f ( not ( i n >> sex_ ) )
34 return f a l s e ;
35 skip_line ( in ) ;
36 sex_ = s t d : : t o u p p e r ( sex_ , s t d : : l o c a l e { } ) ;
37 bmi_ = compute_bmi ( ) ;
38 return true ;
39 }
40
41 v o i d v i t a l _ s t a t s : : p r i n t ( s t d : : ostream& out , i n t t h r e s h o l d )
42 const {
43 out << s t d : : setw ( 6 ) << height_
44 << s t d : : setw ( 7 ) << weight_
45 << s t d : : setw ( 3 ) << sex_
46 << s t d : : setw ( 6 ) << bmi_ ;
47 i f (bmi_ >= t h r e s h o l d )
48 out << ;
49 else
50 out << ;
51 out << << name_ << \n ;
52 }

lists/q05/vital_stats.cpp

1 #i n c l u d e <i o s t r e a m >
2 #i n c l u d e <v e c t o r >
3
4 #i n c l u d e " v i t a l _ s t a t s . hpp"
5
6 // / Reads and p r i n t s t h e v i t a l s t a t s o f two p e r s o n s .
7 i n t main ( ) {
8 s t d : : v e c t o r <v i t a l _ s t a t s > s t a t s { } ;
9 vital_stats s {};
10
11 f o r ( i n t i { 0 } ; i < 2 ; i ++){
12 s . read ( std : : cin , i ) ;
13 s t a t s . push_back ( s ) ;
14 }
15

7
16 f o r ( auto e : s t a t s )
17 e . p r i n t ( s t d : : cout , 2 5 ) ;
18
19 return 0;
20 }

lists/q05/main.cpp

Pede-se:
(a) Consulte a documentao do Doxygen aqui. Certifique-se de ter entendido todo o cdigo.
(b) Compile estas listagens via makefile. Os resultados da execuo foram os esperados?
(c) Gere a documentao correspondente a estas listagens utilizando o Doxygen.
6. Considere as seguintes listagens:
1 #i f n d e f MATH_HPP_
2 #d e f i n e MATH_HPP_
3
4 namespace math{
5
6 double area ( double ) ;
7
8 }
9
10 #e n d i f

lists/q06/math.hpp

1 #i n c l u d e "math . hpp"
2
3 extern double pi ;
4
5 namespace math{
6
7 double area ( double r ){ return pi r r ; }
8
9 }

lists/q06/math.cpp

1 #i n c l u d e <i o s t r e a m >
2
3 #i n c l u d e "math . hpp"
4
5 // More d i g i t s t h a t t y p i c a l i m p l e m e n t a t i o n s o f d o u b l e s u p p o r t .
6 double pi {3.14159265358979323846264338327};
7
8 i n t main ( ) {
9 double r {};
10
11 s t d : : c o u t << " Inform t h e r a d i u s o f t h e c i r c l e : " ;
12 s t d : : c i n >> r ;
13 s t d : : c o u t << " Area o f t h e c i r c l e : " << math : : a r e a ( r ) << s t d : : e n d l ;
14

8
15 return 0;
16 }

lists/q06/main.cpp

Pede-se:
(a) O que faz a linha 3 de math.cpp? Explique o funcionamento de variveis extern.
(b) Observe as listagens math.hpp e math.cpp. Explique como criar namespaces.
(c) Quais as vantagens de criar namespaces para suas bibliotecas?
(d) Compile estas listagens via makefile. Os resultados da execuo foram os esperados?
7. Considere a seguinte listagem, onde introduzimos o tratamento de excees:
1 #i n c l u d e <i o s t r e a m >
2
3 u s i n g namespace s t d ;
4
5 i n t main ( ) {
6 string line {};
7 while ( g e t l i n e ( cin , l i n e )){
8 try {
9 l i n e . a t ( 1 0 ) = ; // can throw out_of_range
10 i f ( l i n e . s i z e ( ) < 20)
11 l i n e . append ( l i n e . max_size ( ) , ) ; // can throw l e n g t h _ e r r o r
12 f o r ( s t r i n g : : size_type s i z e ( l i n e . s i z e ( ) ) ;
13 s i z e < l i n e . max_size ( ) ; s i z e = s i z e 2 ) {
14 l i n e . r e s i z e ( s i z e ) ; // can throw b a d _ a l l o c
15 }
16 l i n e . r e s i z e ( l i n e . max_size ( ) ) ; // can throw b a d _ a l l o c
17 c o u t << " okay \n" ;
18 }
19 c a t c h ( out_of_range c o n s t& ex ) {
20 c o u t << ex . what ( ) << \n ;
21 c o u t << " s t r i n g i n d e x ( 1 0 ) out o f r a n g e . \ n" ;
22 }
23 c a t c h ( l e n g t h _ e r r o r c o n s t& ex ) {
24 c o u t << ex . what ( ) << \n ;
25 c o u t << "maximum s t r i n g l e n g t h ( " << l i n e . max_size ( ) << " ) e x c e e d e d . \ n" ;
26 }
27 c a t c h ( e x c e p t i o n c o n s t& ex ) {
28 c o u t << " o t h e r e x c e p t i o n : " << ex . what ( ) << \n ;
29 }
30 catch ( . . . ) {
31 c o u t << "Unknown e x c e p t i o n type . Program t e r m i n a t i n g . \ n" ;
32 abort ( ) ;
33 }
34 }
35 return 0;
36 }

lists/q07/list4503.cpp

9
(a) Consulte as referncias bibliogrficas da disciplina a respeito do tratamento de excees.
Veja tambm os exemplos disponibilizados nos sites cplusplus.com e tutorialspoint. Aps a
leitura destas referncias, assegure-se de compreender toda a listagem list4503.cpp.
(b) Quando uma exceo lanada combina com a de um manipulador? A ordem dos manipu-
ladores importante? Explique o funcionamento geral de um bloco try-catch.
(c) Explique o funcionamento do manipulador da linha 30.
(d) Quais as situaes que podem levar o cdigo da listagem list4503.cpp a lanar excees?
(e) Utilize um makefile para compilar esta listagem. Execute o programa com strings de
tamanhos variados e certifique-se de compreender os resultados produzidos pelo programa.
8. Quando um programa lana uma exceo, o fluxo de controle normal interrompido e o me-
canismo de manipulao de excees assume o controle. O objeto que representa a exceo
lanada copiado para uma regio de armazenamento segura e o mecanismo de manipulao
de excees passa a buscar por um bloco try-catch na pilha de execuo. Ao encontrar um
bloco try-catch, o mecanismo verifica os tipos dos manipuladores em busca de compatibili-
dade. Se nenhuma compatibilidade for identificada, o mecanismo busca pelo prximo bloco
try-catch abaixo na pilha de execuo. Este processo continua at que um manipulador com-
patvel seja encontrado ou a pilha se esgote. Se um manipulador compatvel encontrado, todos
os frames previamente investigados so desempilhados da pilha de execuo, sendo invocados
os destrutores de todos os objetos locais dos frames desempilhados, at que se chegue ao frame
onde o manipulador compatvel se encontra. Este processo de desempilhamento conhecido
como unwinding. Aps o unwinding, o objeto da exceo lanada inicializa o objeto da ex-
ceo do manipulador e o corpo do catch executado. Aps a execuo do catch, o objeto
da exceo liberado e a execuo continua na instruo seguinte ao fim do bloco try-catch
correspondente. Caso nenhum manipulador compatvel seja identificado, o mecanismo de ma-
nipulao de excees chama a funo std::terminate para abortar a execuo do programa.
Considere a seguinte listagem a seguir, que utilizaremos para ilustrar esse comportamento:
1 #i n c l u d e <e x c e p t i o n >
2 #i n c l u d e <i o s t r e a m >
3 #i n c l u d e <s t r i n g >
4
5 // / Make v i s u a l t h e c o n s t r u c t i o n and d e s t r u c t i o n o f o b j e c t s .
6 class visual
7 {
8 public :
9 v i s u a l ( s t d : : s t r i n g c o n s t& what )
10 : id_ { s e r i a l _ } , what_{what}
11 {
12 ++s e r i a l _ ;
13 p r i n t ( "" ) ;
14 }
15 v i s u a l ( v i s u a l c o n s t& ex )
16 : id_ { ex . id_ } , what_{ ex . what_}
17 {
18 p r i n t ( " copy " ) ;
19 }
20 ~visual ()

10
21 {
22 p r i n t ( "~" ) ;
23 }
24 v o i d p r i n t ( s t d : : s t r i n g c o n s t& l a b e l )
25 const
26 {
27 s t d : : c o u t << l a b e l << " v i s u a l ( " << what_ << " : " << id_ << " ) \ n" ;
28 }
29 private :
30 static int serial_ ;
31 i n t c o n s t id_ ;
32 s t d : : s t r i n g c o n s t what_ ;
33 };
34
35 int visual : : serial_ {0};
36
37 v o i d count_down ( i n t n )
38 {
39 s t d : : c o u t << " s t a r t count_down ( " << n << " ) \ n" ;
40 v i s u a l v{ "count_down l o c a l " } ;
41 try
42 {
43 i f ( n == 3 )
44 throw v i s u a l ( " e x c e p t i o n " ) ;
45 e l s e i f (n > 0)
46 count_down ( n 1 ) ;
47 }
48 c a t c h ( v i s u a l ex )
49 {
50 ex . p r i n t ( " c a t c h " ) ;
51 throw ;
52 }
53 s t d : : c o u t << " end count_down ( " << n << " ) \ n" ;
54 }
55
56 i n t main ( )
57 {
58 try
59 {
60 count_down ( 2 ) ;
61 count_down ( 4 ) ;
62 }
63 c a t c h ( v i s u a l c o n s t ex )
64 {
65 ex . p r i n t ( " c a t c h " ) ;
66 }
67 s t d : : c o u t << " A l l done ! \ n" ;
68 }

lists/q08/list4504.cpp

Compile esta listagem e certifique-se de compreender os resultados exibidos.

11
9. Considere as seguintes listagens, onde excees personalizadas so criadas:
1 #i n c l u d e <i o s t r e a m >
2 #i n c l u d e <e x c e p t i o n >
3
4 u s i n g namespace s t d ;
5
6 c l a s s MyException : p u b l i c e x c e p t i o n {
7 public :
8 c o n s t c h a r what ( ) c o n s t n o e x c e p t {
9 r e t u r n "C++ E x c e p t i o n " ;
10 }
11 };
12
13 i n t main ( ) {
14 try
15 {
16 throw MyException ( ) ;
17 }
18 c a t c h ( MyException& e )
19 {
20 s t d : : c o u t << " MyException caught " << s t d : : e n d l ;
21 s t d : : c o u t << e . what ( ) << s t d : : e n d l ;
22 }
23 c a t c h ( s t d : : e x c e p t i o n& e )
24 {
25 // Other e r r o r s
26 }
27 return 0;
28 }

lists/q09/my_exception.cpp

1 #i n c l u d e <s t d e x c e p t >
2 #i n c l u d e <s t r i n g >
3
4 class rational {
5 public :
6 c l a s s zero_denominator : p u b l i c s t d : : l o g i c _ e r r o r {
7 public :
8 zero_denominator ( s t d : : s t r i n g c o n s t& what_arg ) : l o g i c _ e r r o r { what_arg } {}
9 };
10 r a t i o n a l ( ) : r a t i o n a l {0} {}
11 r a t i o n a l ( i n t num) : numerator_ {num} , denominator_ {1} {}
12 r a t i o n a l ( i n t num , i n t den ) : numerator_ {num} , denominator_ { den } {
13 i f ( denominator_ == 0 )
14 throw zero_denominator { " z e r o denominator " } ;
15 reduce ( ) ;
16 }
17 // Omitted f o r b r e v i t y
18 };

lists/q09/zero_denominator.cpp

Com base nestes exemplos, crie uma nova exceo que seja til ao projeto de seu grupo.

12

You might also like