2010-10-24 14 views
2

Habituellement, si ma chaîne #include devient circulaire, je la résous en remplaçant l'une des #includes par une déclaration forward puis en déplaçant toutes les implémentations de fonction qui dépendent de ce type dans le fichier cpp, où I #include l'en-tête . Mais - dans certaines situations, il est mauvais de mettre l'implémentation de la fonction dans le fichier cpp - en particulier lorsqu'il s'agit de modèles ou de fonctions en ligne. Par conséquent - Existe-t-il d'autres manières de traiter les chaînes circulaires #include plutôt que d'utiliser des déclarations anticipées?C++ comment faire pour gérer les dépendances circulaires?

merci!

+0

pourriez-vous peut-être nous donner un exemple? Je n'arrive pas à comprendre exactement ce que vous voulez dire – Earlz

+0

Vous pouvez transmettre des modèles de déclaration très bien. –

Répondre

7

Vous devez limiter ces dépendances circulaires car elles rendent le code difficile à comprendre et difficile à utiliser.

Cela étant dit, parfois, de telles dépendances sont nécessaires. Dans ces cas, vous pouvez déclarer toutes les entités dans un seul fichier d'en-tête, puis après toutes les déclarations ont fourni des définitions pour les modèles de fonction et les fonctions en ligne. Par exemple:

#ifndef MY_AWESOME_INCLUDE_GUARD 
#define MY_AWESOME_INCLUDE_GUARD 

template <typename> struct B; 

template <typename T> 
struct A 
{ 
    template <typename U> 
    void f(B<U>); 
}; 

template <typename T> 
struct B 
{ 
    template <typename U> 
    void f(A<U>); 
}; 

template <typename T> 
template <typename U> 
void A<T>::f(B<U>) { } 

template <typename T> 
template <typename U> 
void B<T>::f(A<U>) { } 

#endif 
Questions connexes