IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
logo

FAQ C++Consultez toutes les FAQ

Nombre d'auteurs : 34, nombre de questions : 368, derni�re mise � jour : 14 novembre 2021  Ajouter une question

 

Cette FAQ a �t� r�alis�e � partir des questions fr�quemment pos�es sur les forums de http://www.developpez.com et de l'exp�rience personnelle des auteurs.

Je tiens � souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes ; les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne pr�tend pas non plus �tre compl�te. Si vous trouvez une erreur ou si vous souhaitez devenir r�dacteur, lisez ceci.

Sur ce, nous vous souhaitons une bonne lecture.

SommaireOrganisation du code source (7)
pr�c�dent sommaire suivant
 

Le strict minimum : c'est-�-dire les seuls fichiers d'en-t�te contenant les d�clarations ou d�finitions de ce qui va �tre utilis� et permettant ainsi � la compilation de r�ussir.

Mis � jour le 15 octobre 2009 3DArchi

Il est pr�f�rable d'avoir des d�clarations anticip�es (forward declaration) dans les fichiers d'en-t�te et d'inclure l'en-t�te de d�claration dans le fichier source. L'objectif � atteindre est que tout fichier d'en-t�te doit pouvoir �tre inclus ind�pendamment des autres et compiler. Ce qui veut dire qu'un fichier d'en-t�te doit contenir le moins de choses possibles.

Code c++ : S�lectionner tout
1
2
3
4
class A 
{ 
    // d�claration de la classe A 
};
Code c++ : S�lectionner tout
1
2
3
4
5
6
7
8
class A; // d�claration anticip�e 
class B 
{ 
    // d�claration de la classe B 
    // � 
  
   void do_someting_with_a_A(A const &); 
};
Code c++ : S�lectionner tout
1
2
3
#include "B.h" 
#include "A.h" 
// d�finition de B�
� noter que la d�claration anticip�e n'est possible que si le compilateur n'a pas besoin de conna�tre compl�tement le type�: pointeur, r�f�rence. On ne peut l'utiliser ni pour l'h�ritage ni pour la composition.
Pour aller plus loin avec les d�clarations anticip�es, jusqu'� pr�sent vous avez l'habitude de d�couper votre code en deux fichiers�: un fichier d'en-t�te MyClass.h pour la d�claration et un fichier d'impl�mentation MyClass.cpp pour la d�finition. Notez qu'on peut associer un troisi�me fichier MyClassFwd.h pour regrouper les d�clarations anticip�es li�es � CMyClass. Ce fichier contient tout naturellement une d�claration anticip�e de la classe�:

Code c++ : S�lectionner tout
class CMyClass;
Mais, c'est l'occasion d'y mettre aussi d'autres d�clarations associ�es qui vont syst�matiquement (ou presque) avec votre classe. Ce peut �tre des enum, des d�clarations de fonctions externes, etc.�:

Code c++ : S�lectionner tout
1
2
3
4
5
6
class CMyClass; 
enum E_options_my_class 
{ 
   // � 
}; 
std::ostream& operator << (std::ostream& O, const CMyClass& B);
Lorsqu'une autre classe n�cessite une d�claration anticip�e de CMyClass, elle fait alors appel � cet en-t�te�:

Code c++ : S�lectionner tout
#include "MyClassFwd.h"

Mis � jour le 15 octobre 2009 3DArchi

  1. Le fichier d'en-t�te de la d�claration de la classe ;
  2. les fichiers standards (STL) ;
  3. les fichiers d'en-t�te de l'O.S. ;
  4. les fichiers d'en-t�te des biblioth�ques tierces (boost, xml, wxWidget�) ;
  5. les fichiers d'en-t�te de mes biblioth�ques externes ;
  6. les fichiers d'en-t�te de mon projet.

Cet ordre est une proposition parmi d'autres qui ont aussi leur l�gitimit�. Vous pouvez suivre un autre ordre d'inclusion si vous en sentez le besoin compte tenu de vos pratiques habituelles ou du contexte de votre application. En fait, l'id�e ma�tresse est de maintenir une coh�rence sur l'ensemble du projet. Quelle que soit la politique que vous choisissez de mettre en ouvre, utilisez la m�me syst�matiquement dans tous vos fichiers.

Mis � jour le 15 octobre 2009 3DArchi Luc Hermitte

Une classe est d�clar�e dans un fichier header (extension .h, .hpp. ou encore .hxx) dont l'inclusion multiple est prot�g�e gr�ce � des directives du pr�processeur :

Code c++ : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
#ifndef MACLASSE_H 
#define MACLASSE_H 
  
class MaClasse 
{ 
public: 
    void Fonction(); 
}; 
  
#endif
Le corps de la classe est g�n�ralement plac� dans un fichier s�par� dont l'extension varie (.cpp, .cxx, .C). Ce fichier contient le code compilable :

Code c++ : S�lectionner tout
1
2
3
4
5
6
#include "maclasse.h" 
  
void MaClasse::Fonction() 
{ 
    // impl�mentation de la fonction 
}
Pour utiliser une classe dans d'autres fichiers .cpp, il suffira d'inclure l'en-t�te qui la d�clare ; c'est l'�diteur de liens qui se chargera de trouver tout seul o� se trouve le corps des fonctions (i.e. vous n'avez pas � vous en pr�occuper).
Certains seront parfois tent�s d'inclure un fichier .cpp : c'est une erreur et cela ne doit jamais �tre fait (il en r�sulterait plusieurs corps pour une m�me fonction, par exemple).

Code c++ : S�lectionner tout
1
2
3
4
5
6
7
8
#include "autreclasse.h" 
#include "maclasse.h" 
  
void AutreClasse::Fonction() 
{ 
    MaClasse M; 
    M.Fonction(); 
}
Le corps de certaines fonctions peut figurer dans le header, en particulier pour les fonctions inline et dans le cas de fonctions/classes templates (lire � ce sujet Pourquoi mes templates ne sont-ils pas reconnus � l'�dition des liens ?). Attention � ne pas oublier le mot cl� inline si vous placez le corps de fonctions dans un header ailleurs que dans la d�claration d'une classe :

Code c++ : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef MACLASSE_H 
#define MACLASSE_H 
  
class MaClasse 
{ 
public: 
    void FonctionInline() 
    { 
        // Plac�e dans la d�claration de la classe 
        // cette fonction est consid�r�e en ligne sans 
        // que le mot cl� inline ne figure 
    } 
}; 
  
// Plac�e en dehors de la d�claration de la classe, le mot cl� inline 
// est indispensable pour ne pas provoquer des d�finitions multiples 
// de la fonction et donc des erreurs � l'�dition de liens 
inline void FonctionInline2() 
{ 
} 
#endif
Soyez aussi vigilants au respect de la casse dans l'inclusion d'une header. Si vous incluez maclasse.h, veillez � bien nommer votre fichier header maclasse.h et non MaClasse.h car certains syst�mes font la distinction de casse dans le nom des fichiers et cela s'applique aussi lors de leur inclusion dans un fichier C++.

Mis � jour le 3 f�vrier 2007 Aurelien.Regat-Barrel Laurent Gomila

Les templates n�cessitent d'avoir toute la d�finition dans le fichier d'en-t�te. Pour maintenir une politique coh�rente, on peut s�parer la d�claration d'une classe template (.h) et sa d�finition (.tpp). La d�finition est incluse � la fin du fichier de d�claration :

Code c++ : S�lectionner tout
1
2
3
4
5
6
7
template<class T> 
class TMyTemplateClass 
{ 
public:  
   void do_something(); 
}; 
#include "MyTemplateClass.tpp"
Code c++ : S�lectionner tout
1
2
3
4
5
6
7
// en-t�te si besoin 
  
// d�finition 
template<class T> 
void TMyTemplateClass<T>::do_something() 
{ 
}

Mis � jour le 15 octobre 2009 3DArchi

Inclure le fichier en tout premier dans un fichier .cpp. Ce dernier doit compiler sans erreur.

Mis � jour le 15 octobre 2009 3DArchi JolyLoic

Les en-t�tes pr�compil�s n'offrent malheureusement pas de standard dans leur mise en ouvre. Tous les compilateurs ne les supportent pas, et ceux qui savent les g�rer ne le font pas tous de la m�me fa�on. Est-ce une raison pour les abandonner ? Non. Car ils offrent de vrais avantages en terme de temps de compilation, surtout pour les projets utilisant des biblioth�ques volumineuses ou complexes. La question qui se pose alors est de savoir quoi mettre dans les en-t�tes pr�compil�s ? Il faut garder � l'esprit l'objectif des en-t�tes pr�compil�s : acc�l�rer la compilation. Il faut donc veiller � mettre les fichiers des biblioth�ques externes r�currents dans vos sources ainsi que ceux qui sont susceptibles de provoquer des inclusions en cascade (afxXXX.h avec les MFC, wx.h dans wxWidgets). En revanche ne mettez pas des fichiers d'en-t�tes du projet en cours car ce sont ceux qui sont le plus susceptibles de varier et d�gradent ainsi le temps de compilation en for�ant � tout recompiler.
Il faut �tre vigilant � ne pas transformer le fichier d'en-t�tes pr�compil�s en un fourre-tout contenant tous les fichiers de toutes les biblioth�ques utilis�es dans un projet. Cela rompt le principe qui veut que l'on minimise les d�pendances entre les unit�s de compilation. Identifiez correctement les fichiers cl�s qui sont significatifs dans le temps de compilation de votre projet.

Mis � jour le 15 octobre 2009 3DArchi

Proposer une nouvelle r�ponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plut�t sur le forum de la rubrique pour �a


R�ponse � la question

Liens sous la question
pr�c�dent sommaire suivant
 

Les sources pr�sent�es sur cette page sont libres de droits et vous pouvez les utiliser � votre convenance. Par contre, la page de pr�sentation constitue une �uvre intellectuelle prot�g�e par les droits d'auteur. Copyright � 2025 Developpez Developpez LLC. Tous droits r�serv�s Developpez LLC. Aucune reproduction, m�me partielle, ne peut �tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'� trois ans de prison et jusqu'� 300 000 � de dommages et int�r�ts.