La première règle échoue dès qu'il y a des dépendances circulaires. Il ne peut donc pas être appliquée strictement.
(Cela peut encore être fait pour travailler, mais celle-ci se déplace d'un ensemble de beaucoup de travail de la programmeur pour le consommateur de ces bibliothèques qui est évidemment faux.)
Je suis tout à fait en faveur de la règle 2 (bien qu'il pourrait être bon d'inclure "déclaration anticipée en-têtes" à la place de la vraie affaire, comme en <iosfwd>
, car cela réduit le temps de compilation). Généralement, je crois que c'est une sorte d'auto-documentation si un fichier d'en-tête "déclare" quelles sont les dépendances qu'il a – et quelle meilleure façon de le faire est d'inclure les fichiers nécessaires?
EDIT:
Dans les commentaires, j'ai été contesté que les dépendances circulaires entre les en-têtes sont un signe de mauvaise conception et doit être évitée.
Ce n'est pas correct. En fait, les dépendances circulaires entre les classes peuvent être inévitables et ne sont pas un signe de mauvaise conception. Les exemples sont abondants, permettez-moi de mentionner l'Observateur modèle qui a une référence circulaire entre l'observateur et l'objet.
Pour résoudre la circularité entre les classes, vous devez employer l'avant de la déclaration parce que l'ordre de déclaration des questions en C++. Maintenant, il est tout à fait acceptable pour gérer cette déclaration dans une circulaire de manière à réduire le nombre total de fichiers et de centraliser le code. Certes, dans cette affaire, qui n'a pas le mérite de ce scénario, car il n'y a qu'une seule déclaration anticipée. Cependant, j'ai travaillé sur une bibliothèque où il y a beaucoup plus.
// observer.hpp
class Observer; // Forward declaration.
#ifndef MYLIB_OBSERVER_HPP
#define MYLIB_OBSERVER_HPP
#include "subject.hpp"
struct Observer {
virtual ~Observer() = 0;
virtual void Update(Subject* subject) = 0;
};
#endif
// subject.hpp
#include <list>
struct Subject; // Forward declaration.
#ifndef MYLIB_SUBJECT_HPP
#define MYLIB_SUBJECT_HPP
#include "observer.hpp"
struct Subject {
virtual ~Subject() = 0;
void Attach(Observer* observer);
void Detach(Observer* observer);
void Notify();
private:
std::list<Observer*> m_Observers;
};
#endif