- template<>
private:
ListImp<>& List;
T* Cur;
return Cur!= "NULL";
T* temp= Cur;- if(Cur)
Cur= Cur->Next;
return temp;
Cur= List.PeekHead();
ListIteratorImp( ListImp<>& List): List( List), Cur(Cist.PeekHead())
{}
bool HasNext() const
{
}
T* Next()
{
}
void Restart()
{
}
public:
class ListIteratorImp
{
};
template <>
void Print(ListImp<>& List)
{
- for(ListIteratorImp<> Lit(List); Lit.HasNext();)
- Print(Lit.Next());
}- Print(Lit.Next());
- bananas.Add(new Banana(...));
...
Iterate(bananas, Print);
void Print(Banana*);
ListImp<> bananas;
void main()
{
}
Podemos definir em uma função mais genérica para processamento de uma lista a qual toma como argumento um ponteiro para uma função a ser chamada para cada elemento visitado por um iterador, assim ao invés de ter uma função para imprimir, outra para salvar em arquivo, etc, teremos apenas uma função que toma como argumento a operação a ser realizada, isto opde ser implementado pelo seguinte template:
void Iterate(ListImp<>& List, void (*func)(T*))
{
- (*func)(Lit.Next());
for(ListIteratorImp<>& Lit(List); Lit.HasNext();) }- (*func)(Lit.Next());
O trecho de código a seguir ilustra o uso do template:...Uma alternativa aos métodos HasNext da classe paramétrica ListIteratorImpm, consiste em sobrecarregar os operadores de conversão para inteiro e de pré e pós incremento. Desta forma um objeto do tipo ListIteratorImp<> pode ser implicitamente convertido para inteiro em expressões de testes em sentenças de iteração, for, do e while, dispensando assim o uso de HasNext. Similarmente o próximo elementoa a ser visitado pelo iterador pode ser obtido pelos operadores de incremento, dispensando o uso de Next, a idéia é tornar o código mais parecido com o de laços envolvendo números e portanto mais legível.(note no template ListIteratorImp a sintaxe para distinguir a sobrecarga do operador de pré do de pós incremento.)Com esses operadores sobrecarregados, o template da função iterate pode agora ser escrito como:
void Print(ListImp<>& List)
{
- for(ListIteratorImp<> Lit(List); Lit(); ++Lit)
- Print(Lit.Current());
}
- operator int()
return Cur!='NULL';
{
}
- T* operator ++(int)
return Next();
{
}
- T* operator ++()
Cur=Cur->Next;
if(Cur)
return Cur;- typeid(expressão)
typeid(nome de tipo) - #include <>
#include <> class Banana{....};
int main()
{- printf(typeid(Banana).name());
- void PrintName(Primitivo2i)* p)
- cout<< p="=">}
{ - Observação: para contornar um bug do GCC podemos escrever
- #include<>
void PrintName(const type_info& info)
{- const char* name= info.name();
while(isdigit(*name))- name++;
}- void PrintName(Primitvo2D* p)
- if( p==0)
- cout << "null"; else
- PrintName(typeid(*p));
{ - const char* name= info.name();
- ProcessaLinha2D(l);
- l=(Line2D*)p;
{
}
RTTI significa Informações de Tipo em Tempo de Execução, em C++ um tipo é representado por uma estrutura do tipo "typeinfo" a qual é declarada no arquivo de cabeçalho #include <>, em tempo de execução o tipo de uma expressão, e o nome do tipo como o operador typeid. A sintaxe é
O operador typeid retorna o typeinfo como argumento. O método mais útil de typeinfo é name, no qual retorna um ponteiro para .......Ascz.......... contendo um nome do tipo. Por exemplo:
Outro método útil da classe Type_info é o operador de comparação ==.
Os novos operadores de cast, aquele que é relaciona com a DinamicCast o qual tenta converter em tempo de execução a expressão passada como argumento para o tipo entre < >. Se a conversão puder ser feita DinamicCast retorna um ponteiro não nulo. Caso contrário o argumento não pode ser convertido para o tipo especificado. O trecho de código a seguir ilustra:
- Primitivo2D* p;
Line2D* l;,br>...
l=dynamic_cast<> (p);
if(l!=0)
- if(typeid(*p)==typeid(Line2D))


6:11 AM
Unknown
0 comentários:
Postar um comentário