FAQ Lite
Bibliotecas de Classes

[ 32.1 ] Onde eu posso obter uma cópia da STL?
[ 32.2 ] Como eu posso localizar um objeto Fred em um container STL de Fred*, tal como vector<Fred*>?
[ 32.3 ] Onde eu posso obter ajuda sobre como usar STL?
[ 32.4 ] Como você controla o que acontece se você tem uma biblioteca de classes C++ com verificação dinâmica de tipos?
[ 32.5 ] O que é o NIHCL? Onde que posso obtê-la?
[ 32.6 ] Onde, na Internet, eu posso conseguir o código que acompanha Numerical Recipes
[ 32.7 ] Porque meu executável é tão grande?
[ 32.8 ] Onde que consigo toneladas e mais toneladas de informações adicionais sobre bibliotecas de classes C++?

[ 32.1 ] Onde eu posso obter uma cópia da STL?

STL é a Standard Templates Library. Você pode obter uma cópia em:
Topo
[ 32.2 ] Como eu posso localizar um objeto Fred em um container STL de Fred*, tal como vector<Fred*>?

Funções STL tais como std::find_if() ajudam você a localizar um elemento T em um container de T's. Mas se você tem um container de pointers, tal como vector<Fred*>, essas funções vão capacitá-lo a encontrar um elemento que se iguala a um determinado pointer Fred*, mas não vão levá-lo a encontrar um elemento que se iguala a um determinado objeto Fred.

A solução é usar um parâmetro opcional que especifica a função de igualdade. A seguinte template de classe permite que você compare objetos no outro extremo dos pointers desreferenciados (os próprios objetos apontados por).

    template<class T>
    class DereferencedEqual {
    public:
      DereferencedEqual(const T* p) : p_(p) { }
      bool operator() (const T* p2) const { return *p == *p2; }
    private:
      const T* p_;
    }; 
Agora você pode usar essa template para localizar um objeto Fred apropriado:
    void userCode(vector<Fred*> v, const Fred& match)
    {
      find_if(v.begin(), v.end(), DereferencedEqual<Fred>(&match));
      // ...
    } 
Topo
[ 32.3 ] Onde eu posso obter ajuda sobre como usar STL?

Topo
[ 32.4 ] Como você controla o que acontece se você tem uma biblioteca de classes C++ com verificação dinâmica de tipos?

  • Quando tudo é derivado de uma única classe raiz, normalmente Object
  • Quando as classes container (List, Stack, Set, etc) não são templates
  • Quando as classes container (List, Stack, Set, etc) inserem/extraem elementos como pointers para Object. Isso permite que você coloque Apple dentro do container, mas quando você resgata esse elemento do container, o compilador sabe apenas que é algo derivado de Objeto, logo você tem que usar um pointer cast para converter o elemento de volta a um Apple*; é sua responsabilidade controlar as coisas e garantir que este elemento seja realmente um Apple.

Você pode fazer o pointer cast com segurança usando dynamic_cast, mas esse teste dinâmico é exatamente isso: dinâmico. Esse estilo de codificação é a essência da verificação dinâmica de tipos em C++. Você chama uma função que diz: converta esse Object em um Apple ou devolva-me NULL se isso não for um Apple, mas você não sabe o que realmente vai acontecer até que o código seja executado.

Quando você usa templates para implementar seus containers, o compilador C++ consegue validar estaticamente 90% das informações sobre tipos de dados de sua aplicação (90% aqui é uma forma de dizer praticamente tudo, alguns alegam que a verificação atinge 100%, mas aqueles que usam classes persistentes conseguem um pouco menos que 100% de verificação estática). O ponto básico é: em C++ você consegue genericidade a partir de templates, não a partir de herança.

Topo
[ 32.5 ] O que é o NIHCL? Onde que posso obtê-la?

NIHCL é a abreviatura de National-Institute-of-Health's-class-library. Pode ser adquirida via ftp://128.231.128.7/pub/NIHCL/nihcl-3.0.tar.Z

NIHCL (algumas pessoas pronunciam N-I-H-C-L, outras pronunciam nickel) é uma tradução para C++ da biblioteca de classes Smalltalk. Há casos em que o uso que NIHCL faz de verificação dinâmica de tipos é realmente benéfico (por exemplo, em objetos persistentes). Mas há também casos em que o modo como usa verificação dinâmica de tipos tem um certo conflito com a característica de verificação estática de tipos da linguagem C++.

Topo
[ 32.6 ] Onde, na Internet, eu posso conseguir o código que acompanha Numerical Recipes

Esse software é vendido e portanto seria ilegal oferecê-lo gratuitamente na Internet. Contudo, seu preço é de apenas US$ 30,00
Topo
[ 32.7 ] Porque meu executável é tão grande?

Há quem fique surpreso como tamanho que os executáveis atingem., especialmente quando o código fonte é trivial. Um simples programa hello word pode gerar um executável maior do que normalmente se espera (40Kb ou mais).

Uma das razões para que os executáveis sejam grandes é o fato de que partes da biblioteca de execução (runtime library) do C++ são incorporadas ao seu programa. A incorporação de bibliotecas de execução depende do que você usa no programa, e de como as bibliotecas em uso foram subdivididas pelos seus implementadores. Por exemplo, a biblioteca <iostream.h> é bem grande, composta de numerosas classes e funções virtual. O uso de qualquer parte dessa biblioteca vai fazer com ela seja praticamente toda incorporada ao seu programa, devido às interdependências internas ao código da biblioteca.

Você pode diminuir o tamanho de seu programa usando uma versão da biblioteca com ligações dinâmicas, ao invés de usar a versão estática.

Consulte os manuais de seu compilador, ou o suporte técnico do fornecedor, para maiores detalhes.

Topo
[ 32.8 ] Onde que consigo toneladas e mais toneladas de informações adicionais sobre bibliotecas de classes C++?

Em C++ Libraries FAQ, mantida por Nikki Locke
Topo Anterior Próximo Índice
C++ FAQ Lite
Copyright © 1991-98 by Marshall Cline Ph.D., cline@parashift.com
Tradução: Dagoberto Haele Arnaut

| Home | Bookmarks | Universidades | Para Saber mais | Universidades | WEB Directory | Mapa do site |