Como Desenvolver um modelo de classe em C ++

modelos de classe executar o trabalho pesado dos tipos de modelos. Você usa um modelo de classe para definir objetos de praticamente qualquer tamanho. Na maioria dos casos, você usa classes para representar objetos complexos ou para executar tarefas mal adaptados para função ou estrutura modelos.

Você normalmente aulas de código em um arquivo separado usando o nome da classe como o nome do arquivo. A definição de classe aparece em um arquivo de cabeçalho, enquanto o código aparece em um arquivo de código. Para tornar as coisas um pouco mais fácil de entender, este exemplo evita a configuração normal e mostra o exemplo inteiro usando um único arquivo.

O exemplo mostra uma implementação da fila especializado. Ele inclui muitas das características de uma fila padrão e, em seguida, adiciona alguns recursos para atender às necessidades especiais de desenvolvimento. Filas e outros recipientes tendem a conter código complexo, mas você também precisa usá-los com uma variedade de tipos de dados, fazendo um modelo de classe a implementação perfeita. o ClassTemplate exemplo aqui mostra o código para este exemplo.

#incluir #incluir usando namespace std-templateclasse MyQueue {protected: vector dados em público: void Add (const T entrada) -void Remove () - PrintString void () - PrintInt void () - bool IsEmpty () -} - modeloMyQueue vazio:: Add (const T input) {data.push_back (entrada) -} templateMyQueue vazio:: Remove () {data.erase (data.begin ()) -} templateMyQueue vazio:: PrintString () {vetor:: Iterator PrintIt = data.begin () - enquanto (PrintIt = data.end ()!) {Cout lt; lt; * PrintIt lt; lt; endl-PrintIt ++ -}} modeloMyQueue vazio:: PrintInt () {vetor:: Iterator PrintIt = data.begin () - enquanto (PrintIt = data.end ()!) {Cout lt; lt; * PrintIt lt; lt; endl-PrintIt ++ -}} modeloMyQueue bool:: IsEmpty () {return data.begin () == data.end () -} int main () {MyQueue StringQueue-cout lt; lt; StringQueue.IsEmpty () lt; lt; endl-StringQueue.Add ( "Olá") - StringQueue.Add ( "Adeus") - cout lt; lt; "cordas de impressão:" lt; lt; endl-StringQueue.PrintString () - cout lt; lt; StringQueue.IsEmpty () lt; lt; endl-StringQueue.Remove () - cout lt; lt; "cordas de impressão:" lt; lt; endl-StringQueue.PrintString () - StringQueue.Remove () - cout lt; lt; StringQueue.IsEmpty () lt; lt; endl-MyQueue IntQueue-IntQueue.Add (1) -IntQueue.Add (2) -cout lt; lt; "ints de impressão:" lt; lt; endl-IntQueue.PrintInt () - retorno 0-}

O exemplo que se inicia com a classe MyQueue. Observe que dados é uma vetor, não um fila como você poderia esperar. UMA fila é um adaptador - como tal, não fornece suporte para muitas das características encontradas em recipientes, tais como vetor - uma das quais é a utilização de iterators.

Este exemplo utiliza um iterator para impressão, por isso depende de uma vetor, em vez de um fila como um ponto de partida. Sempre que você criar sua própria versão especializada de uma construção comum, certifique-se de começar com o objeto certo. Caso contrário, você pode encontrar a experiência de criar a nova classe frustrante no mínimo, impossível, no pior caso.

MyQueue inclui a capacidade de adicionar, remover e elementos de impressão. Além disso, você pode verificar se a fila está vazio ou cheio. Você já viu o código para estas tarefas em outras partes do livro.

Você pode se perguntar sobre o código utilizado para a impressão. O exemplo inclui métodos separados para cordas de impressão e inteiros, o que pode parecer contra-intuitivo. Afinal de contas, por que não simplesmente declarar o iterador da seguinte forma para que ele aceite qualquer tipo de dados:

vetor:: Iterator PrintIt = data.begin () -

O problema é que a iteração exige um tipo de dados específicos. Consequentemente, você deve declará-lo como mostrado. Caso contrário, você recebe essa mensagem de erro inúteis:

erro: esperado '-' antes 'PrintIt'

Em algum ponto, você quer testar esta nova classe utilizando passos semelhantes aos encontrados em a Principal(). O teste verifica se a fila realmente não detectar os estados vazias e cheias, como adição e remoção de elementos funciona, e se as rotinas de impressão funcionar. Aqui está a saída deste exemplo:

1Printing cordas: cordas HelloGoodbye0Printing: ints Goodbye1Printing: 12

menu