VinBR

PM 05/09/2011

Oct 18th, 2011
36
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.82 KB | None | 0 0
  1. // notasdogarcia.blog.com
  2.  
  3. Se declaro em uma classe uma função:
  4.  
  5. class A
  6. {
  7. A operator=(A a) { ... }
  8. }
  9.  
  10. E escrevo a função:
  11.  
  12. int main()
  13. {
  14. A dia, mes;
  15.  
  16. dia = mes;
  17. }
  18. O compilador vai entender que voce desejava fazer isso:
  19.  
  20. dia.operator=(mes);
  21.  
  22. Entendido?
  23.  
  24. Assim voce pode redefinir o significado dos operadores de C++, Fantástico não? E super confuso tb!
  25.  
  26. Isso se chama sobrecarga de operador.
  27.  
  28. Se quer que o operador "+" possa "somar" a classe batata com um inteiro, como se faz?
  29.  
  30. Bem assim:
  31.  
  32. class batata
  33. {
  34. int feijoada = 10;
  35. batata operator+(int i) { this->feijoada += i; return (*this); }
  36. }
  37. Pronto,
  38.  
  39. Mas e se o usuario quiser usar:
  40. dia = 21 + A?
  41.  
  42. Seguindo aquela regra do compilador ele tentaria fazer algo como:
  43.  
  44. 21.operator+(...) ?
  45.  
  46. E num ia dar certo né.
  47.  
  48. Então voce pode fazer o seguinte para receber um parametro antes.
  49.  
  50. batata operator+(int i, batata A) { ... }
  51.  
  52. Assim o compilador já substitui pra voce a chamada de função com os 2 parâmetros jogando o 21 no parametro i e o tipo A no parametro a.
  53.  
  54. // Não se deve usar isso aqui com mta frequencia ou sem atenção, pois isso dificulta a legibilidade do código de um tanto.
  55.  
  56. // Isso funciona para varios operadores inclusive [], >, <, ==, etc.
  57. // Mas não funciona para .* e uns outros e esqueci de anotar e não me lembro mais agora =].
  58.  
  59. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  60.  
  61. Como comumente se trata erros e exceções em um programa?
  62.  
  63. A maneira mais básica é verificar o retorno de cada função e colocar um if para o caso de a função retornar um aviso de erro.
  64.  
  65. Assim o código fica enorme e cheio de ifs, e elses, um tanto dificil de ler.
  66.  
  67. Existe outro modo?
  68.  
  69. Sim existe o sistema de try/catch e lançamento de exceção (throw)
  70. Uma função quando perceber que ocorreu um erro em sua execução pode usar o comando throw ##classeDeTratamento##();
  71. Assim a função construtora da "##classeDeTratamento##" é chamada, a função é encerrada,
  72. e uma exceção de nome "##classeDeTratamento##" é lançada.
  73.  
  74. E o try-catch, faço o que com ele?
  75. Para voce captar a exceção que foi lançada voce precisa que ela seja lançada dentro de um "try",
  76. e é preciso que depois do try haja um catch(##classeDeTratamento##){ ... } para receber e tratar a o erro.
  77. Ou seja suponha que a função erroTeste() retorna uma exceção de nome "Batata":
  78.  
  79. try
  80. {
  81. erroTeste();
  82. }catch(Batata)
  83. {
  84. printf(" O erro Batata ocorreu, o programa será encerrado!, tire essa batata de perto do computador seu gorduxinho!\n");
  85. exit(1);
  86. }
  87.  
  88. E é assim que um erro da classe Batata seria tratado. E como seria essa classe?
  89. Assim:
  90.  
  91. class Batata
  92. {
  93. public:
  94. Batata(){};
  95. // Essa função construtora simples já é o suficiente. (eu acho xP)
  96. }
  97.  
  98. Voce pode acrescentar outros catchs após o primeiro para pegar outros erros.
  99. E se voce digitar o catch assim: "catch(...)", ele irá pegar qualquer lançamento de erro que passar por ele,
  100. como se fosse um "default:" em um switch.
  101. funcao() deve ser uma funcao construtora de uma classe.
  102.  
  103. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  104.  
  105. Agora porque uma classe para representar um erro? o que eu ganho com essa complicação?
  106.  
  107. Seguinte, ao inicializar a função construtora de uma classe voce pode por exemplo salvar nas variáveis da própria classe
  108. informações importantes para o tratamento do erro ex:
  109.  
  110. class acessoInvalido
  111. {
  112. int tamanhoDoArranjo;
  113. int posicaoAcessada;
  114.  
  115. public:
  116. acessoInvalido(int tm, int ps)
  117. {
  118. new acessoInvalido a;
  119. a.tamanhoDoArranjo = tm;
  120. a.posicaoAcessada = ps;
  121. return a;
  122. }
  123. }
  124.  
  125. Agora para receber esse objeto durante o tratamento (ou seja dentro do catch() { } )
  126. voce deve colocar dentro do catch:
  127.  
  128. catch(acessoInvalido obj){ printf(" Voce tentou acessar a posição: %d, em um arranjo de comprimento %d\n", obj.posicaoAcessada, obj.tamanhoDoArranjo); }
  129.  
  130. Entendido?
  131.  
  132. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  133.  
  134. Se dentro de um catch() {} voce lança um throw, sem nada assim:
  135.  
  136. try{ }
  137. catch(acessoInvalido obj){ printf("bla bla bla\n"); throw; }
  138.  
  139. Voce pode tratar uma parte do erro, e re-lançar o erro para ser captado por algum outro catch mais atrás no código.
  140.  
  141. Assim a função continua buscando um catch, sempre que não encontra um ela retorna a função chamada para anterior.
  142. Se eventualmente chegar no main e não houver um try-catch lá para receber o throw, o main é retornado e o programa encerrado, com uma menssagem de erro
  143. de nome "acessoInvalido".
  144.  
  145. Se um catch é preparado para receber o erro de uma "classe B::extend public C{...}", e recebe um erro de nome C, ela irá tratar o erro.
  146.  
  147. ou seja o catch: catch(B) {...} ira também aceitar um erro de C.
  148.  
  149. // Olha eu posso ter entendido algo errado vai ver é o contrário o se fosse catch(C) ele aceitaria erros de B,
  150. // Mas bem, testes voces isso, se tiverem com paciencia, por enquanto não estou =].
  151.  
  152. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  153.  
  154. Na declaração de uma função ou de um protótipo dela, voce pode incluir os tipos de erros que ela está apta para aceitar.
  155. Para faze-lo faça:
  156.  
  157. void f(int a) throw(x2,x3)
  158. {
  159. ...
  160. }
  161.  
  162. Se um erro não contido nessa especificação surgir, é chamada uma função "unexpected()" (ou algo assim) e o programa é encerrado.
  163.  
  164. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  165.  
  166. Se voce deseja que dizer que uma função não deve lançar nenhuma excessão, use:
  167.  
  168. void f() throw();
  169.  
  170. Assim, ela chamará a unexpected() para qualquer excessão que for lançada dentro dela.
  171.  
  172. // Uma função sem nenhuma especificação de lançamento obviamente aceita lançar qualquer erro sem restrições.
  173. // Ou seja: f() { ... } aceita lançamento de qualquer erro dentro dela, como era esperado.
  174.  
  175. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  176.  
  177. Ao definir em uma função os erros que ela lança, deve-se ser coerente com todos os protótipos dela,
  178. ou seja, não se pode declarar que ela lança erro A e B, na especificação
  179. e em um protótipo esquecer de escrever isso, ou escrever que ela lança apenas A.
  180.  
  181. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  182.  
  183. Ao redeclarar uma função de uma classe pai, voce pode aumentar as restrições de erros dela, porém não pode diminuir essa restrição.
  184. Ou seja, se uma função f() não tinha restrições, voce pode escrever ela agora com uma ou mais restrições,
  185. ex:
  186. f() throw(A,B) {...}
  187.  
  188. Se f já lançava A e B voce pode escrever isso:
  189.  
  190. f() throw(A) { ... }
  191.  
  192. mas não pode escrever
  193.  
  194. f() throw(A,B,C) { ... }
  195.  
  196. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  197.  
  198. Nota: voce pode declarar uma classe dentro de outra!
  199.  
  200. Se ela for private só pode ser usada dentro da classe mãe.
  201.  
  202. // Beim fim da aula, até a próxima!
  203.  
Advertisement
Add Comment
Please, Sign In to add comment