Question

Y at-il jamais un tel modèle de qu'il est dépendances impossible de tout garder en tête uniquement les fichiers? Et si on règle FORCÉES une classe par tête uniquement?

Aux fins de cette question, nous allons ignorer les choses statiques:)

Était-ce utile?

La solution

Je ne connais aucune offre en standard C ++, à l'exception que vous avez statics déjà mentionnés, qui nécessitent une bibliothèque pour définir une unité de traduction complète (au lieu d'en-têtes seulement). Cependant, il est recommandé de ne pas faire cela, parce que quand vous le faites, vous obligez tous vos clients recompiler toute leur code chaque fois que votre bibliothèque change. Si vous utilisez des fichiers source ou une bibliothèque statique ou une forme de distribution de bibliothèque dynamique, votre bibliothèque peut être modifiée / mise à jour / modifiée sans forcer tout le monde à recompilation.

Autres conseils

Il est possible, je dirais, à la condition expresse de ne pas utiliser un certain nombre de fonctionnalités du langage. Que vous avez remarqué, quelques utilisations du mot-clé static

Il peut exiger quelques astuce, mais ils peuvent être examinés.

  1. Vous devrez garder chaque fois que vous devez briser un cycle de dépendance, même si les deux fichiers seront des fichiers en-tête dans la pratique la distinction en-tête / source.
  2. Free-fonctions (non-modèle) doivent être déclarés en ligne, le compilateur ne peut pas les en ligne, mais si elles sont déclarées il ne se plaignait qu'ils ont été redéfinis lorsque le client builts sa bibliothèque / exécutable.
  3. Globalement données partagées (variables globales et les attributs statiques de la classe) doit être émulé en utilisant l'attribut statique locale dans les fonctions / méthodes de classe. En pratique, il importe peu dans la mesure où l'appelant est concerné (ajoute juste ()). Notez que dans C ++ 0x cela devient la voie privilégiée car il est garanti d'être thread-safe, tout en protégeant du fiasco de l'ordre d'initialisation, jusque-là ... il est thread-safe;)

Le respect de ces 3 points, je crois que vous seriez en mesure d'écrire une bibliothèque d'en-tête seule à part entière (quelqu'un voit quelque chose d'autre que je manqué?)

Un certain nombre de bibliothèques Boost ont utilisé des astuces similaires pour être en-tête que même si leur code n'a pas été complètement modèle. Par exemple Asio fait très consciemment et propose l'alternative en utilisant des drapeaux (voir notes de version pour Asio 1.4.6 ):

  • les clients qui ont seulement besoin quelques fonctions ne inquiétez pas la construction / lien, ils attrapent tout ce dont ils ont besoin
  • les clients qui comptent sur un peu plus ou si vous voulez réduire le temps de compilation sont offerts la possibilité de construire leur propre bibliothèque Asio (avec leurs propres ensembles de drapeaux) et incluent les en-têtes « légers »

De cette façon (au prix de quelques efforts de la part de la bibliothèque devs) les clients obtiennent leur gâteau et le manger aussi. Il est une solution assez de bien je pense.

Note: Je me demande si les fonctions de static pourraient être inline, je préfère utiliser moi-même si jamais vraiment regardé les espaces de noms anonymes en elle ...

La seule classe par règle d'en-tête n'a pas de sens. Si cela ne fonctionne pas:

#include <header1>
#include <header2>

alors une certaine variation de cette volonté:

#include <header1a>
#include <header2>
#include <header1b>

Il peut en résulter moins d'une classe par tête, mais vous pouvez toujours utiliser (void *) et des moulages et des fonctions en ligne (dans ce cas, la « ligne » sera probablement dûment ignoré par le compilateur). La question, me semble, peut être réduite à:

class A
{
// ...
void *pimpl;
}

Est-il possible que la mise en œuvre privée, Pimpl, dépend de la déclaration de A? Si oui, alors pimpl.cpp (en-tête) doit à la fois précéder et suivre de l'Hégire Mais puisque vous pouvez toujours, une fois de plus, l'utilisation (void *) et des moulages et des fonctions en ligne dans les en-têtes précédent, il peut être fait.

Bien sûr, je peux me tromper. Dans les deux cas:. Ick

Dans ma longue carrière, je n'ai pas rencontré modèle de dépendance qui désavouer la mise en œuvre d'en-tête uniquement.

Rappelez-vous que si vous avez des dépendances circulaires entre les classes, vous devrez peut-être recourir à une ou l'autre interface abstraite - paradigme de la mise en œuvre concrète, ou utiliser des modèles (à l'aide des modèles vous permet de transférer de références propriétés / méthodes de paramètres du modèle, qui sont résolus plus tard lors de l'instanciation).

Cela ne veut pas dire que vous devez toujours viser les bibliothèques d'en-tête uniquement. Bon comme ils sont, ils devraient être réservés au modèle et le code en ligne. Ils ne doivent pas inclure des calculs complexes importants.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top