Modelos em c ++

Video: Mini opengl. Rasterizador em C/C++. Modelo 3D

C ++ é um exemplo de uma linguagem de programação fortemente tipado. É esta forte digitado-ness que permite que as funções a ser sobrecarregado, como mostrado no seguinte trecho de código:

grau void (Student&) Grau -void (Land&) Fn -void (Student& s) {grau (s) -}

C ++ não tem problemas em entender que a chamada para notas) deve ser dirigida para a função grau (Student&).

Fortes métodos forças de digitação a ser sobrecarregado que aparecer o mesmo no nível C ++, mas são bastante diferentes na sua implementação como no exemplo a seguir:

int comparar (int l, int r) {return (l gt; r)? 1: (l lt; r)? -1: 0-} int comparar (l duplo, duplo r) {return (l gt; r)? 1: (l lt; r)? -1: 0-}

este comparar() retorna 1 se a esquerda; argumento lado é maior do que a direita; mão, -1 se o esquerdo; argumento lado é menor do que a direita; mão, e um 0 se eles forem iguais. Apesar da semelhança do código de fonte, o código de máquina gerados por essas duas funções é muito diferente, devido a diferenças na forma que int é implementado em relação Duplo ao nível da máquina.

O pré-processador oferece uma forma de evitar tais implementações redundantes:

#define COMPARAR (l, r) (((l) gt; (r)) 1:?? ((L) lt; (r)) -1: 0)

No entanto, esta sofre de uma série de limitações graves - não o menos importante dos quais é a necessidade para a função para se encaixar em uma expressão (com efeito, em uma linha). Além disso, erros em uma macro pré-processador pode levar a problemas que são difíceis de depurar.

Video: Curso de C++ em Qt - #19 QSqlQueryModel: Modelo de Acesso a SQL

modelos de função

A característica de modelo em C ++ permite ao programador para reter as vantagens de tipagem forte e evitar as limitações do pré-processador usando um marcador para o tipo. Os seguintes define comparar() por alguma classe não especificada T para ser nomeado mais tarde:

modelo  T comparar (t l, T r) {return (l gt; r)? 1: (l lt; r)? -1: 0-}

Uma tal definição é conhecido como um modelo de função. Este modelo de função - cujo nome completo é comparar(T, t) - pode ser convertida em uma função real, fornecendo T:

template dupla comparar(dobro dobro)-

Você também pode permitir C ++ para encontrar e instanciar a classe T para si, quer fornecendo uma declaração parcial ou utilizando a função como mostrado no seguinte fragmento de código de exemplo:

Video: Visualizador de Modelos OFF + Shaders GLSL

template dupla comparar (double, double) -int main () {cout lt; lt; comparar (0, 0) lt; lt; " "lt; lt; comparar (1.0, 2.0) lt; lt; endl-retorno 0-}

Aqui a função comparar (duas vezes, duas vezes) é criado pela declaração inicial, mesmo sem o adicional após o nome da função. A função comparar (int, int) é criado quando ele é usado na instrução comparar (0, 0).

modelos de classe



A característica modelo C ++ permite que as classes de ser definida usando os tipos que são especificadas mais tarde. Isso resolve uma série de problemas diferentes em uma maneira de tipo seguro. Um problema, embora longe de ser o único problema, é que de contêineres genéricos. (UMA recipiente é uma classe que contém objetos de outra classe.)

Nos primeiros dias de C ++, a única maneira de criar uma classe contêiner genérico era de contar com o genérico vazio ponteiro (o ponteiro de classe vazio*). Muito parecido com o #definir “Função” mencionado anteriormente, esta abordagem efetivamente evitou mecanismo de tipagem forte do C ++ com declarações como a seguinte:

classe Container {public: void add (void *) - void * get () - // ... outros membros ...} - Classe storeStudent recipiente-void (Student& s) {container.add ((void *)&s) -} Student * getStudent () {return (Student *) container.get () -}

modelos C ++ permitir ao programador para definir um modelo de classe em que um ou mais tipos não é especificado até que a classe é usado:

modelo  classe Container {public: put void (T * p) -T * get () -} -

Na prática, o modelo de classe deve primeiro ser convertido em uma verdadeira aula, fornecendo um tipo de T. Nesse caso, pode ser utilizado em segurança de tipo completo:

Recipiente recipiente-Student-container.put (&s) -Student * pS = container.get () -

Não há necessidade de definir o seu próprio recipiente de aula da Standard Template Library fornece uma série de tais classes. Por exemplo, o seguinte trecho de código cria uma lista ligada de ponteiros para Aluna objetos e adiciona um para o final da lista:

// deve incluir  no início do modulelist sList-Student * pS = new Student () - sList.push_back (&s) -

Muitas das classes que você usa todos os dias são, de fato, instanciações de modelos de classe. O exemplo mais comum é quando istream e ostream são usadas para a entrada e saída padrão.

Iterators

Embora eles não são diretamente parte do recurso de modelo, iterators fornecer uma maneira padrão para acessar os diferentes tipos de recipientes disponíveis no Standard Template Library. Todos os recipientes de proporcionar um método que retorna uma iteração para o início do recipiente e uma forma de verificar quando o iteração está na extremidade do recipiente (isto inclui recipientes não ordenados para que ‘começo’ e ‘fim’ é um conceito aleatório). A iteração em si fornece, pelo menos, dois métodos: um para devolver o objecto corrente e um para evitar a iteração para o objecto seguinte.

Video: Curso de C++ em Qt - #20 QSqlTableModel - Modelo de Acesso Baseado em Tabelas

Os código a seguir percorre uma coleção de ponteiros para Aluna objetos. Este mesmo código funciona independentemente do que um dos muitos tipos de recipientes que você escolher para usar:

// displayAllStudents - iterar uma lista de // estudantes- invocar o toString () // método em displayAllStudents eachvoid (lista& sList) {for (auto iter = sList.begin (!) - iter = sList.end () - iter ++) {Student * pS = * iter-cout lt; lt; pS-gt; toString () lt; lt; endl-}}

(Este exemplo assume que a classe Aluna inclui um método para sequenciar() que retorna uma representação de caracteres de um estudante.)

Esta função utiliza o início() método para retornar uma iteração que aponta para o primeiro membro do recipiente. A função percorre o recipiente até que as aponta para iteradoras fim() que se refere ao elemento após o último membro no recipiente. O operador move o incremento iteração para o próximo membro no recipiente enquanto o operador * devolve o objecto apontada pelo iteração.

o auto palavra-chave diz declarar iter ser do tipo retornado pela sList.begin (). Esta é uma extensão de C ++ adicionado pelo padrão de 2,011. Sem auto, Eu teria declarado iter para ser do tipo Lista::const_iterator.


Publicações relacionadas