Comment développer un modèle de classe en C ++

Modèles de classe effectuent le gros des types de modèle. Vous utilisez un modèle de classe pour définir des objets de près de toute taille. Dans la plupart des cas, vous utilisez des classes pour représenter des objets complexes ou pour effectuer des tâches mal adaptées pour fonction ou la structure des modèles.

Vous normalement des cours de code dans un fichier séparé en utilisant le nom de la classe comme nom de fichier. La définition de la classe apparaît dans un fichier d'en-tête, tandis que le code apparaît dans un fichier de code. Pour rendre les choses un peu plus facile à comprendre, cet exemple évite la configuration normale et montre l'exemple entier en utilisant un seul fichier.

L'exemple montre une mise en œuvre de file spécialisée. Il comprend de nombreuses caractéristiques d'une file d'attente standard, puis ajoute quelques fonctionnalités pour répondre aux besoins particuliers de développement. Files d'attente et d'autres conteneurs ont tendance à contenir du code complexe, mais vous avez aussi besoin de les utiliser avec une variété de types de données, ce qui rend un modèle de classe la mise en œuvre parfaite. La ClassTemplate exemple montre ici le code de cet exemple.

#comprendre #comprendre using namespace std-modèlemyQueue de classe {protected: vecteur des données publiques: void Add (T const entrée) -void Supprimer () - printString void () - impression utilisé void () - bool IsEmpty () -} - modèlemyQueue vide:: Ajouter (T const entrée) {data.push_back (entrée) -} modèlemyQueue vide:: Remove () {data.erase (data.begin ()) -} modèlemyQueue vide:: PrintString () {vecteur:: iterator = PrintIt data.begin () - tout (PrintIt = data.end ()!) {cout lt; lt; * PrintIt lt; lt; endl-PrintIt ++ -}} modèlemyQueue vide:: Impression utilisé () {vecteur:: iterator = PrintIt data.begin () - tout (PrintIt = data.end ()!) {cout lt; lt; * PrintIt lt; lt; endl-PrintIt ++ -}} modèlebool myQueue:: IsEmpty () {return data.begin () == data.end () -} int main () {myQueue StringQueue-cout lt; lt; StringQueue.IsEmpty () lt; lt; endl-StringQueue.Add ("Bonjour") - StringQueue.Add ("Au revoir") - cout lt; lt; «Impression de chaînes:» lt; lt; endl-StringQueue.PrintString () - cout lt; lt; StringQueue.IsEmpty () lt; lt; endl-StringQueue.Remove () - cout lt; lt; «Impression de chaînes:» 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; «Impression ints:" lt; lt; endl-IntQueue.PrintInt () - retour 0-}



L'exemple commence par la classe MyQueue. Noter que données est un vecteur, pas un file comme vous vous en doutez. UN file est un adaptateur - en tant que telle, elle ne fournit pas de support pour la plupart des caractéristiques qui se retrouvent dans des conteneurs, tels que vecteur - dont l'un est l'utilisation de itérateurs.

Cet exemple utilise un iterator pour l'impression, de sorte qu'il repose sur une vecteur, plutôt que d'un file en tant que point de départ. Chaque fois que vous créez votre propre version spécialisée d'une construction commune, assurez-vous que vous commencez avec le bon objet. Sinon, vous trouverez peut-être l'expérience de la création de la nouvelle classe frustrant au minimum, impossible dans le pire des cas.

MyQueue inclut la possibilité d'ajouter, supprimer, et des éléments d'impression. En outre, vous pouvez vérifier si une file d'attente est vide ou plein. Vous avez déjà vu le code pour ces tâches dans d'autres parties du livre.

Vous pourriez vous demander sur le code utilisé pour l'impression. L'exemple inclut des méthodes distinctes pour les chaînes d'impression et entiers, ce qui pourrait sembler contre-intuitif. Après tout, pourquoi ne pas simplement déclarer la iterator comme suit pour qu'il accepte tout type de données:

vecteur:: iterator = PrintIt data.begin () -

Le problème est que l'itérateur nécessite un type de données spécifique. Par conséquent, vous devez le déclarer comme indiqué. Sinon, vous obtenez ce message d'erreur inutile:

erreur: attendu '-' avant 'PrintIt'

À un certain moment, vous voulez tester cette nouvelle classe en utilisant des étapes semblables à ceux trouvés dans main (). Les test vérifie si la file d'attente ne fait détecter la états vides et pleins, comment ajouter et supprimer des éléments fonctionne, et si les routines d'impression fonctionnent. Voici la sortie de cet exemple:

1Printing cordes: cordes HelloGoodbye0Printing: ints Goodbye1Printing: 12

» » » » Comment développer un modèle de classe en C ++