[Plan du site]
Vous êtes ici ---
> Le Site du Zéro
> Les tutoriels
> Officiels
> Programmation
> Apprenez à programmer en C++ ! > Annexes > Ce que vous pouvez encore apprendre
> Lecture du tutoriel
Ce que vous pouvez encore apprendre
Qu'on se le dise : bien que le tutoriel C++ s'arrête là, vous ne savez
pas tout sur tout. D'ailleurs, personne ne peut vraiment prétendre tout
savoir sur le C++ et toutes ses bibliothèques.
L'objectif n'est pas de
tout savoir, mais d'
être capable d'apprendre ce dont vous avez besoin lorsque c'est nécessaire.
Si je devais moi-même vous apprendre tout sur le C++, j'y passerais
toute une vie (et encore, ça serait toujours incomplet). J'ai autre
chose à faire, et j'en serais de toute façon incapable.
Du coup, plutôt que de tout vous apprendre, j'ai choisi de vous
enseigner de bonnes bases tout au long du cours. Cette annexe a pour
but, maintenant que le cours est fini, de vous donner un certain nombre
de pistes pour continuer votre apprentissage.
J'ai découpé ce chapitre en 3 parties :
- Ce que vous pouvez encore apprendre sur le langage C++ lui-même.
- Ce que vous pouvez encore apprendre sur la bibliothèque standard du C++, que nous avons seulement effleuré ici.
- Ce que vous pouvez encore apprendre sur la bibliothèque Qt.
Le langage C++ est suffisamment riche pour qu'il vous reste encore de
nombreuses notions à découvrir. Certaines d'entre elles sont
particulièrement complexes, je ne vous le cache pas, et vous n'en aurez
pas besoin tout le temps.
Toutefois, au cas où vous en ayez besoin un jour, je vais vous présenter
rapidement ces notions. A vous ensuite d'approfondir vos connaissances, par exemple en lisant des
tutoriels écrits par d'autres Zéros sur le C++, en lisant des livres dédiés au C++, ou tout simplement en faisant une recherche Google.
Voici les notions que je vais vous présenter ici :
- L'héritage multiple
- Le masquage de méthodes
- Les exceptions
- Les templates
- Les namespaces
- Les classes et fonctions amies
- Les méthodes virtuelles pures et les classes abstraites
L'héritage multiple
L'héritage multiple consiste à hériter de plusieurs classes à la fois.
Nous avons déjà fait cela dans la partie sur Qt, pour pouvoir utiliser
une interface dessinée dans Qt Designer :
Pour hériter de plusieurs classes, il suffit de mettre une virgule entre les noms de classe, comme on l'avait fait :
Code : C++1
2
3
4 | class FenCalculatrice : public QWidget, private Ui::FenCalculatrice
{
};
|
C'est une notion qui paraît simple mais qui, en réalité, est très complexe.
En fait, la plupart des langages de programmation plus récents, comme
Java et Ruby, ont carrément décidé de ne pas gérer l'héritage multiple.
Pourquoi ? Parce que ça peut être utile dans certaines conditions assez
rares, mais si on l'utilise mal (quand on débute) ça peut devenir un
cauchemar à gérer.
Bref, jetez un coup d'oeil à cette notion, mais juste un coup d'oeil de
préférence, car vous ne devriez pas y avoir recours souvent.
Le masquage de méthodes
Lorsqu'une classe hérite d'une autre classe, il est possible d'avoir 2 méthodes du même nom (et du même prototype).
Prenons un exemple :
Ici, la classe Guerrier qui hérite de Personnage possède une méthode
qui s'appelle elle aussi coupDePoing. Si notre guerrier fait un
coupDePoing, c'est la méthode définie dans Guerrier qui sera utilisée,
celle de Personnage sera ignorée (masquée).
Nanoc en parle plus en détail dans son
tutoriel sur l'héritage. N'hésitez pas à aller y jeter un oeil.
Les exceptions
Les exceptions sont un mécanisme du C++ qui permet de gérer les erreurs.
En temps normal, pour vérifier qu'une fonction n'a pas eu d'erreur,
celle-ci renvoie un booléen. Il nous suffit alors de tester la valeur
de retour comme ceci :
Code : C++1
2
3
4
5
6
7
8 | if (maFonction())
{
cout << "Ca a marché !";
}
else
{
cout << "Erreur lors de l'appel de maFonction()";
}
|
Ca marche, mais ce n'est pas très pratique dans un gros programme. En
effet, parfois on a besoin de faire "remonter" l'erreur à la fonction
appelante, parce qu'on ne peut pas traiter l'erreur de suite. Ici, on
mélange le code "utile" du programme avec la gestion des erreurs.
Un des gros intérêt des exceptions, c'est qu'elles vous permettent de regrouper vos erreurs. Cela fonctionne en 2 temps :
- On essaie (try) d'exécuter certaines fonctions.
- Si une de ces fonctions a généré une erreur, on la récupère (catch) et on gère l'erreur dans un endroit bien défini du code.
Exemple :
Code : C++ 1
2
3
4
5
6
7
8
9
10 | try // On essaie d'exécuter les lignes de codes qui suivent
{
maFonction();
autreFonction();
encoreUneAutreFonction();
}
catch (const string& erreur) // Si une erreur est survenue dans les lignes précédentes, on exécute ces lignes
{
cout << "Erreur ! Raison : " << erreur;
}
|
Il faut que les fonctions maFonction(), autreFonction() et
encoreUneAutreFonction() envoient un message d'erreur à l'aide du
mot-clé
throw si jamais elles rencontrent une erreur. Dans ce cas, si une erreur est détectée, les instructions situées dans le bloc
catch seront exécutées.
Pour plus d'informations sur les exceptions, je vous recommande la lecture du
tutoriel de Nanoc.
Pour information, les exceptions ne sont
pas bien utilisables avec la bibliothèque Qt, qui ne les prend pas
correctement en charge. Vous ne pouvez donc pas vraiment utiliser
d'exceptions dans un programme Qt.
Les templates
Les templates sont une notion pratique et puissante du C++ que nous
avons déjà rencontrée, sans vraiment expliquer le fonctionnement
derrière.
Imaginez que vous ayez besoin d'écrire une fonction (ou une classe) qui
doit pouvoir accepter n'importe quel type de paramètre, et qui doit
pouvoir retourner n'importe quel type. En fait, vous avez besoin
d'écrire une fonction évolutive qui s'adapte à tous les types de
données.
Voici par exemple une fonction d'addition qui utilise le principe des templates :
Code : C++1
2
3
4
5 | template<class T> T addition(T element1, T element2)
{
T somme = element1 + element2;
return somme;
}
|
La fonction annonce dès le début qu'elle utilise le principe des templates. Le
<class T>
indique que le symbole T représente n'importe quel type de variable.
Dans la fonction ensuite, on voit que celle-ci retourne un élément de
type T et qu'elle en reçoit 2 de type T eux aussi. En fait, à la
compilation, le "T" sera remplacé par le type nécessaire. Par exemple,
T sera remplacé par
int si vous appelez la fonction comme ceci :
Code : C++1
2 | int a = 10, b = 15, c = 0;
c = addition(a, b); // T sera remplacé par int car a, b et c sont des int
|
Les templates peuvent aussi être utilisés par des classes. Cela permet
à la bibliothèque standard du C++ (et à Qt aussi d'ailleurs) de créer
des classes qui gèrent des tableaux d'objets à taille variable.
Dans le chapitre sur le réseau, nous avions par exemple utilisé un tableau QList qui utilisait le principe des templates :
Code : C++1 | QList<QTcpSocket *> clients;
|
Les QList sont des tableaux qui acceptent n'importe quel type de
données et dont la taille peut varier. Entre les chevrons < et >,
on indique à la classe ce qu'on va stocker à l'intérieur (ici des
pointeurs sur QTcpSocket).
Grâce aux templates, les QList peuvent donc stocker n'importe quel type de données !
Vous pouvez retrouver une
explication plus détaillée des templates par foester dans son tutoriel.
Les namespaces
Souvenez-vous. Dès le début du tutoriel C++, je vous ai fait utiliser
les objets cout et cin qui permettent d'afficher un message dans la
console et de récupérer le texte saisi au clavier.
Voici le tout premier code source C++ que vous aviez découvert :
Code : C++1
2
3
4
5
6
7 | #include <iostream>
int main()
{
std::cout << "Hello world!" << std::endl;
return 0;
}
|
Le préfixe "std::" correspond à ce qu'on appelle un namespace, c'est-à-dire
espace de nom
en français. Les namespaces sont utiles dans de très gros programmes où
il y a beaucoup de noms de classes et de variables différents.
Quand vous avez beaucoup de noms différents dans un programme, il y a
un risque que 2 classes aient le même nom. Par exemple, vous pourriez
utiliser 2 classes Couleur dans votre programme : une dans votre
bibliothèque "Jeu3D" et une autre dans votre bibliothèque "Fenetre".
Normalement, avoir 2 classes du même nom est interdit... sauf si ces
classes sont chacune dans un namespace différent ! Imaginez que les
namespaces sont comme des "boîtes" qui évitent de mélanger les noms de
classes et de variables.
Si la classe est dans un namespace, on doit placer le nom du namespace en préfixe devant :
Code : C++1
2 | Jeu3D::Couleur rouge; // Utilisation de la classe Couleur située dans le namespace Jeu3D
Fenetre::Couleur vert; // Utilisation d'une AUTRE classe appelée elle aussi Couleur, dans le namespace Fenetre
|
Le namespace "std" est utilisé par toute la bibliothèque standard du
C++. Il faut donc mettre ce préfixe devant chaque nom issu de la
bibliothèque standard (cout, cin, endl, string...).
Il est aussi possible, comme je vous l'avais dit, d'utiliser la directive "using namespace" au début du fichier :
Code : C++
Grâce à ça, dans tout le fichier le compilateur saura que vous faites
références à des noms définis dans le namespace std. Cela vous évite
d'avoir à répéter "std::" partout.
Certains programmeurs préfèrent éviter
d'utiliser "using namespace" car, en lisant le code ensuite, on ne sait
plus vraiment à quel namespace le nom se rapporte.
Pour plus d'informations, lisez le
tutoriel sur les namespaces de Vanger.
Les classes et fonctions amies
Vous vous souvenez de la notion de portée ? Je l'espère en tout cas !
Non ? Si je vous dis "public", "private", "protected", ça vous revient ?
Ah, j'aime mieux ça.

Ces mots-clés servent à définir la portée d'un attribut ou d'une méthode dans une classe :
- Une méthode "public" pourra être appelée depuis n'importe quelle fonction de votre code.
- Une méthode "private" ne pourra être appelée que par une autre méthode de votre classe..
- Une méthode "protected" est identique à private, à la différence près que les classes filles y auront quand même accès elles aussi.
A cette liste, il faudrait rajouter la portée "
friend".
Je n'en ai pas parlé dans le cours car c'est une notion à double
tranchant : elle peut être très pratique dans certains cas, mais si
vous l'utilisez mal vous risquez de ne plus respecter le principe
d'encapsulation (et donc coder comme des malpropres

).
Pour ceux qui veulent en savoir plus et qui me promettent de ne pas utiliser abusivement friend, je les autorise à lire le
tutoriel sur l'amitié de Nanoc (friend = ami au cas où vous n'auriez pas percuté

).
Les méthodes virtuelles (pures) et les classes abstraites
Il y aurait beaucoup à dire sur les notions de méthodes virtuelles
pures, méthodes virtuelles, classes virtuelles et classes abstraites.
La pire erreur serait de mettre tout dans le même paquet. Ces notions
sont chacune très différentes les unes des autres et ne signifient pas
du tout la même chose à chaque fois (quel intérêt d'avoir mis des noms
similaires ? Bah juste pour vous embrouiller

).
Ce que vous devez retenir c'est que ce sont des notions avancées de C++
dont on n'a besoin que dans des cas très précis, donc rares.
Je vous conseille de vous attarder en premier sur la notion de méthodes
virtuelles pures : ce sont des méthodes que l'on définit sans
implémenter. Dans ce cas, la classe est dite "abstraite" et on ne peut
pas l'instancier (on ne peut pas créer d'objets avec). L'implémentation
de la méthode virtuelle pure doit alors être faite dans une classe
fille.
Cette notion est expliquée par cysboy dans son
tutoriel Java. Oui c'est pour du Java je sais, mais le
principe est le même et son tutoriel a l'avantage de montrer le principe à l'aide de nombreux schémas.
Pour des explications spécifiques au C++, jetez un oeil au
cours de Christian Casteyde ou à la
FAQ C++ de Developpez.com.
Je vous laisse faire des recherches supplémentaires à ce sujet si le
coeur vous en dit, mais ne commencez pas par apprendre ça car ce sont
des notions tout de même assez délicates.
Comme le C, le C++ propose une bibliothèque standard. L'avantage par
rapport à une bibliothèque externe comme Qt, c'est justement que cette
bibliothèque est installée par défaut sur tous les ordinateurs. Pas
besoin de livrer des DLL supplémentaires.
La bibliothèque standard du C++ est très riche (et parfois complexe).
Je vous ai présenté quelques notions de base à ce sujet dans mon cours :
- Les entrées / sorties avec cin et cout.
- Les chaînes de caractères à taille variable, avec la classe string.
Ca, c'est vraiment un tout petit bout de la bibliothèque standard C++
qui propose en fait de nombreux autres outils. Comme pour la classe
string, ces outils sont plutôt faciles à utiliser et très pratiques,
mais ils font appels à des mécanismes complexes en interne.
Les différentes parties de la bibliothèque standard du C++
La bibliothèque standard du C++ peut être découpée comme ceci :
- La bibliothèque de flux : c'est elle qui gère les flux d'entrée / sortie cin et cout, en utilisant en particulier les opérateurs << et >>.
- La gestion des chaînes de caractères : avec la classe string.
- La bibliothèque standard du C : elle est aussi
utilisable en C++. En effet, certaines fonctions basiques (comme les
fonctions mathématiques) n'ont pas été réécrites en C++ car cela
n'aurait eu aucun intérêt. Par conséquent, on utilise toujours les
fonctions du C.
- La bibliothèque standard de templates, aussi appelée STL
(Standard Template Library) : c'est une grosse grosse partie de la
bibliothèque standard du C++ qui utilise massivement le principe des
templates que je vous ai présenté un peu plus haut.
La STL
C'est clairement le plus gros morceau de la bibliothèque standard du
C++. Il s'agit d'un ensemble de classes et d'algorithmes qui utilisent
les templates pour créer des conteneurs capables de stocker n'importe
quel type de données.
Présentation de la STL
Quand on veut stocker plusieurs objets du même type en temps normal, on utilise généralement un tableau :
Code : C++1
2 | int tableauEntiers[10];
string tableauChaines[5];
|
Le problème, c'est que
ce genre de tableau a une taille fixe. Le premier ne peut stocker que 10 entiers, et le second que 5 chaînes (string) maximum.
Parfois, on ne sait pas combien de données différentes notre tableau va
contenir. Ca peut très bien être 3 comme 300... Imaginez par exemple un
jeu en ligne : on ne sait pas combien de joueurs vont participer à
l'avance quand on écrit le code. Rappelez-vous de notre programme de
Chat : on ne sait pas combien de gens vont chatter.
Je sais ! On n'a qu'à créer un très grand tableau pour être sûr de pouvoir tout stocker !
int tableauEntiers[999999];
et hop là ! Le problème est réglé !

Ca va pas la tête ?
En faisant ça, vous consommez beaucoup trop de mémoire inutilement. Ce n'est pas du tout efficace.
En fait, le top serait d'avoir un tableau dont la taille change en
fonction des besoins. Il fait 3 cases s'il y a 3 éléments, il
s'agrandit automatiquement à 4 cases si on ajoute un élément, se réduit
à 2 cases si on en enlève un.
Figurez-vous que c'est tout le principe de la STL. Elle propose des
classes "conteneur" qui se comportent comme des tableaux dynamiques (=
à taille variable). Le truc, c'est que la STL propose de très
nombreuses classes conteneur. On aurait pu se dire qu'une aurait
suffit, mais en fait non.
Tout dépend de vos besoins. La
FAQ STL de Developpez.com propose
un schéma qui fait un peu peur au début mais qui résume en fait très bien la situation.
Tout dépend comme vous le voyez si vous avez besoin de créer un tableau
ordonné ou si au contraire l'ordre n'a pas d'importance. Tout dépend
aussi de la fréquence à laquelle vous allez insérer des éléments dans
les conteneurs, de la façon dont vous voulez les lire, etc.
Dans tous les cas, les conteneurs sont capables de stocker n'importe quel type de données grâce aux templates.
Liste des classes de la STL
Voici une liste des différents conteneurs proposés par la STL :
- stack
- queue
- priority_queue
- list
- vector
- dequeue
- map
- set
- multi_map
- multi_set
Chacun d'entre eux a ses spécificités. Le
schéma dont je vous ai parlé vous permet de faire votre choix parmi la jungle des conteneurs disponibles.
Un exemple simple : la classe vector
Commencez par exemple par la classe vector, c'est un bon début pour découvrir la STL.
On peut se servir de vector comme d'un tableau à taille dynamique.
Voici un exemple d'utilisation, pour un vector qui va stocker des int :
Code : C++1
2
3
4
5
6
7 | vector<int> tableauEntiers; // Création d'un tableau d'entiers à taille variable
tableauEntiers.push_back(14); // Insère 14
tableauEntiers.push_back(27); // Insère 27
tableauEntiers.push_back(83); // Insère 83
cout << tableauEntiers[1]; // Affiche 27
|
Le vector ne nécessite donc pas que l'on définisse une taille lors de
sa création. On ajoute des éléments à la fin du tableau avec la méthode
push_back(). On peut ensuite accéder à n'importe quel élément du vector
comme si c'était un tableau (merci la surcharge de l'opérateur [] ! ).
Pour connaître la taille actuelle du
tableau, appelez la méthode size(). Dans notre exemple précédent, cette
méthode aurait renvoyé 3.
Il y aurait beaucoup à dire encore sur les vector. Nanoc leur a justement dédié un
tutoriel que je vous invite à lire.
Les algorithmes
La STL propose de nombreuses fonctions capables d'effectuer des opérations sur ces conteneurs :
- Copier le tableau
- Trier les éléments dans le tableau
- Trouver l'élément le plus petit ou le plus grand
- Scinder ou fusionner un tableau
- Rechercher dans un tableau
- Supprimer les doublons
Bref, toutes les opérations de base sont déjà codées pour vous ! Il n'y a plus qu'à les utiliser.
Où trouver de la documentation ?
Comme je ne peux pas vous expliquer tout ça à moins d'y passer un temps
fou, il faudra lire la documentation ou rechercher d'autres tutoriels.
Personnellement, bien qu'il n'y ait pas de "site officiel" comme pour
Qt, j'ai tendance à utiliser ce site comme documentation de référence
pour la bibliothèque standard du C++ :
Vous y retrouverez en particulier la liste des classes de la STL et des algorithmes qui y sont proposés.
Bonne lecture
Dans le cours, nous avons eu largement le temps d'étudier la
bibliothèque Qt et de découvrir à quel point il était simple de créer
des GUI (fenêtres).
Nous avons aussi découvert que cette bibliothèque était énorme, et qu'on devait plutôt parler de
framework (ensemble de bibliothèques).
Je vous rappelle que Qt est constitué de plusieurs modules :
- GUI
- OpenGL
- Dessin
- Réseau
- SVG
- Scripts
- XML
- SQL
- Core
En ce qui nous concerne, nous avons eu l'occasion de bien faire le tour
du module GUI (c'était le but !) et nous nous sommes initiés aussi un
peu au réseau.
Malgré cela, nous n'avons pas tout tout vu sur le module GUI. D'autre
part, nous avons seulement effleuré le module réseau, et nous n'avons
pas du tout parlé des autres modules.
Je vais, dans cette annexe, vous présenter brièvement quelques-uns de
ces modules. Je ne vais pas vous les expliquer (ce serait beaucoup trop
long !), juste vous en parler pour vous donner quelques pistes.
Surtout, pensez à vous rendre sur
la doc pour en savoir plus !
Module GUI : des petites fonctionnalités cachées
Il y a quelques widgets et fonctionnalités plus rares dont je n'ai pas
eu l'occasion de parler. Je vais vous en présenter quelques-uns
rapidement ici. Ils ne sont pas toujours utiles mais ça peut être bien
de savoir qu'ils existent.
Cette liste des autres fonctionnalités à découvrir n'est pas complète,
loin de là. Je ne connais pas tout. Je vous donne juste une idée des
"petites choses" que vous pouvez découvrir si vous passez un peu de
temps dans la doc.
QCalendarWidget : un calendrier tout prêt
Le widget
QCalendarWidget permet d'afficher un calendrier :
Si vous devez réaliser un agenda ou si l'utilisateur doit sélectionner
une date, nul doute que ce widget vous fera gagner un temps fou !
QSplashScreen : pour faire patienter au démarrage
Parfois, certains programmes sont un peu longs à charger. Pour faire
patienter l'utilisateur, on affiche un "splash screen", c'est-à-dire
une petite image au centre de l'écran. C'est ce que fait Code::Blocks
au démarrage par exemple.
Qt permet de créer un "splash screen" avec la classe
QSplashScreen. On l'utilise en général dans le main, juste avant d'ouvrir la fenêtre principale :
Code : C++ 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 | #include <QApplication>
#include <QTranslator>
#include <QLocale>
#include <QLibraryInfo>
#include <QSplashScreen>
#include <QPixmap>
#include "FenPrincipale.h"
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
QSplashScreen splash(QPixmap("znavigo.png"), Qt::WindowStaysOnTopHint);
splash.show();
// Traduction des chaînes prédéfinies par Qt dans notre langue
QString locale = QLocale::system().name();
QTranslator translator;
translator.load(QString("qt_") + locale, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
app.installTranslator(&translator);
// Ouverture de la fenêtre principale du navigateur
FenPrincipale principale;
principale.show();
return app.exec();
}
|
Résultat :
Le splash screen peut être arrêté en cliquant dessus.
Après, libre à vous de l'arrêter automatiquement au bout d'un certain temps, il faut juste chercher dans la doc comment faire.
Afficher une icône dans le system tray
Pour certaines applications résidentes en mémoire, il peut être utile
de placer une icône dans le system tray, oui là à côté de l'horloge
vous savez.
Qt permet justement de le faire avec QSystemTrayIcon :
Le mieux pour apprendre à s'en servir est de jeter un oeil à l'
exemple fourni dans la doc de Qt.
Module réseau : utilisez des classes de haut niveau
Dans notre découverte du réseau, nous avons utilisé des QTcpSocket et
un QTcpServer. C'est une gestion assez bas niveau des paquets et il
nous a fallu apprendre un peu comment le réseau fonctionnait.
On aurait pu parler des paquets UDP aussi, mais on les utilise vraiment dans des cas spécifiques.
En revanche, ce qu'on n'a pas vu, c'est qu'il y a des classes de plus
haut niveau qui vous évitent d'avoir à manipuler les paquets TCP
directement. Je pense en particulier à :
- QHttp : vous permet d'utiliser le protocole HTTP et donc de télécharger des pages web ou des fichiers via le web.
- QFtp : vous permet de télécharger et d'envoyer des
fichiers par FTP. Vous pourriez créer votre propre client FTP comme
Filezilla par exemple.

Ces classes sont beaucoup plus faciles à utiliser que celles que nous avons vues, donc n'hésitez pas à y jeter un oeil.
Elles sont brièvement introduites dans la
page d'accueil du module réseau sur la doc de Qt.
Module SQL : accès aux bases de données
Si votre programme doit enregistrer de nombreuses données, il peut être
utile de les stocker dans une base de données. C'est un système
puissant pour enregistrer des informations, mais il faut connaître le
langage SQL pour écrire et lire des informations dedans.
Qt propose tout ce qu'il faut pour se connecter à une base de données
dans votre programme, mais il n'inclue pas la base de données... ce
sera à vous de l'installer. En clair, si vous utilisez MySQL comme base
de données, il faudra d'abord aller installer MySQL sur le
site officiel avant de pouvoir établir une connexion avec dans votre programme.
Une fois que vous avez installé votre système de gestion de base de
données sur votre ordinateur, vous pouvez découvrir comment y faire
appel depuis Qt. Le mieux est de lire l'
introduction au module QtSql sur la doc. En tout cas c'est ce que je ferais à votre place.
En quelques minutes de lecture de cette seule page, vous devriez déjà
savoir vous connecter à la base de données et exécuter des requêtes SQL
(mais attention, il faut connaître le langage SQL avant !).
Module XML : pour ceux qui doivent gérer des données au format XML
Le XML est un langage générique qui est à la base de nombreux autres langages, comme XHTML (qui permet de créer des pages web).
Le principe de XML peut être très vite compris si vous avez déjà fait
du XHTML avant. En gros, c'est vous qui définissez vos propres balises :
Code : XML 1
2
3
4
5
6
7
8
9
10 | <bibliotheque>
<livre>
<auteur>J.R.R. Tolkien</auteur>
<titre>Le seigneur des anneaux</titre>
</livre>
<livre>
<auteur>R. Barjavel</auteur>
<titre>La nuit des temps</titre>
</livre>
</bibliotheque>
|
Les données sont placées entre des balises que vous définissez.
L'avantage du XML est qu'il est facile à lire (enfin, tant que le
fichier n'est pas trop gros ou trop complexe).
Vous pouvez vous servir de cette technique pour organiser vos données
dans des fichiers sans avoir recours à une base de données. D'autre
part, le XML est un format d'échange devenu courant de nos jours, et il
est possible que quelqu'un vous "envoie" des données au format XML que
vous devrez traiter dans votre programme.
Pour lire le contenu d'un document XML comme celui ci-dessus (et pour
écrire du XML aussi), il y a le module QtXml qui permet de faire cela
facilement. Il vous faudra acquérir avant un peu de théorie sur le
fonctionnement de XML (DOM, SAX, XQuery, DTD, XML Schema...). Il vaut
mieux être rôdé sur la théorie de XML avant de s'y lancer sinon vous
n'en profiterez pas.
Une fois que vous connaissez un peu mieux le fonctionnement de XML, direction la
page d'accueil du module QtXml
pour découvrir les outils que Qt met à votre disposition pour lire et
écrire du XML. Il y a de quoi faire, et encore une fois je vous le
rappelle, mieux vaut être armé et connaître XML avant de se lancer
là-dedans !
Module Core : toutes les fonctionnalités de base de Qt
Le module QtCore contient des classes de base de Qt qui n'ont pas de
rapport avec les GUI et qui peuvent donc être utilisées dans un
programme purement console.
Dans ce module, on trouve un certain nombre de classes que vous connaissez déjà :
- QString : gestion des chaînes de caractères.
- QByteArray : une suite d'octets (on s'en est servi dans le programme de Chat pour construire des paquets).
- QFile : accès aux fichiers.
- QLocale : permet d'accéder aux habitudes de représentation des nombres et chaînes dans différentes langues.
- QList : une liste capable de stocker un tableau à
taille dynamique (cette classe est une version "Qt" de ce qui se fait
dans la STL dont je vous ai parlé plus haut).
- QUrl : représente une URL.
Voilà quelques exemples de classes du module QtCore que vous avez déjà
utilisées. Comme vous le voyez, ces classes font partie du "coeur" de
Qt et pas du module GUI car elles peuvent être réutilisées dans tous
les autres modules.
Jetez donc un oeil à la
liste des classes du module QtCore. Il y a de quoi faire, et on retrouve notamment de nombreuses versions "Qt" de classes présentes dans la STL (il y a même un
QVector !).
Bonne pêche !
J'espère que cette annexe aura rempli son rôle : vous aider à regarder
dans de nouvelles directions. L'inconnu, ça fait un peu peur au début,
mais on s'y fait très vite vous verrez.
Comme vous avez pu le voir, tout ce que vous pouvez faire en C++ (et en
programmation en général) est tellement riche qu'on n'aurait jamais
assez d'une vie pour tout connaître. J'espère que vous me comprenez
maintenant.
Plutôt que de tout apprendre, essayez plutôt de découvrir une nouvelle
notion à la fois. Si vous vous éparpillez trop, vous aurez du mal à
bien assimiler ces connaissances.
Bon courage, et bonne continuation !