Frage

Gibt es überhaupt ein solches Muster von Abhängigkeiten, dass es unmöglich ist, alles zu halten, in Header nur Dateien? Was passiert, wenn wir eine Regel einer Klasse pro Header nur erzwungen?

Für die Zwecke dieser Frage, sie ignorieren statische Dinge:)

War es hilfreich?

Lösung

Ich kenne keine Funktionen in Standard C ++, mit Ausnahme von Statik, die Sie bereits erwähnt haben, die eine Bibliothek erfordern eine vollständige Übersetzungseinheit (statt nur Header) zu definieren. Allerdings ist es nicht, dass empfohlen zu tun, denn wenn Sie das tun, können Sie alle Ihre Kunden zwingen, ihre gesamte Code-Basis, wenn Ihre Bibliothek Änderungen neu zu kompilieren. Wenn Sie mit Quelldateien oder eine statische Bibliothek oder eine dynamische Bibliothek Vertriebsform sind, können Sie Ihre Bibliothek geändert werden / aktualisiert / modifiziert werden, ohne zu zwingen alle neu zu kompilieren.

Andere Tipps

Es ist möglich, würde ich sagen, auf ausdrückliche Bedingung nicht eine Reihe von Sprache verwendet. Feature: wie Sie bemerken, ein paar Verwendungen des static Schlüsselwort

Es kann ein paar Trick erfordern, aber sie können überprüft werden.

  1. Sie müssen die Header / Quelle Unterschied halten, wenn Sie eine Abhängigkeit zu durchbrechen müssen, obwohl die beiden Dateien Header-Dateien in der Praxis sein wird.
  2. Free-Funktionen (nicht Vorlage) haben inline deklariert werden, der Compiler kann nicht inline sie, aber wenn sie deklariert werden, damit es beschwert nicht, dass sie neu definiert wurden, wenn der Client builts seine Bibliothek / ausführbare Datei.
  3. global gemeinsam genutzte Daten (globale Variablen und Klasse statische Attribute) sollte in Funktionen / Klassenmethoden mit lokalem statischem Attribute emuliert werden. In der Praxis macht es wenig bis der Anrufer geht (nur fügt ()). Beachten Sie, dass in C ++ 0x dies wird die bevorzugte Art und Weise, weil es garantiert ist Thread-sicher sein, während nach wie vor von dem Initialisierungsreihenfolge Fiasko zu schützen, bis dahin ... es ist nicht Thread-sicher;)

Respektierung diese 3 Punkte, ich glaube, Sie wäre in der Lage einen vollwertigen Kopf nur Bibliothek zu schreiben (jeder sieht etwas anderes habe ich verpasst?)

Eine Reihe von Boost-Bibliotheken haben Ähnliche Tricks verwendet, um zu sein Kopf nur obwohl ihr Code nicht vollständig Vorlage war. Zum Beispiel macht Asio sehr bewusst und schlägt vor, die alternative Verwendung von Flags (siehe Release Notes für Asio 1.4.6 ):

  • Kunden, die ein paar Funktionen, die nur brauchen brauchen sich keine Sorgen über den Bau / Verknüpfung, sie greifen nur, was sie brauchen
  • Kunden, die ein bisschen mehr darauf verlassen wollen oder auf der Kompilierung fällen sind die Fähigkeit, bieten ihre eigene Asio Bibliothek zu bauen (mit ihren eigenen Sätzen von Fahnen) und dann sind „leichte“ Header

Auf diese Weise (zum Preis von etwas mehr Aufwand seitens der Bibliothek Devs) die Kunden ihren Kuchen bekommen und es zu essen. Es ist eine ziemlich schöne Lösung, denke ich.

Hinweis: Ich frage mich, ob static Funktionen inlined werden können, ziehe ich mich anonyme Namespaces zu verwenden, so nie wirklich in sie sehe ...

Die eine Klasse pro Kopf Regel ist bedeutungslos. Wenn dies nicht funktioniert:

#include <header1>
#include <header2>

dann eine gewisse Variation dieses Willens:

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

Dies könnte in weniger als eine Klasse pro Kopf führen, aber man kann immer (void *) verwenden und Abgüsse und Inline-Funktionen (in diesem Fall der ‚inline‘ werden wahrscheinlich ordnungsgemäß vom Compiler ignoriert werden). So ist die Frage, wie mir scheint, kann reduziert werden:

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

Ist es möglich, dass die private Implementierung Pimpl, auf der Erklärung von A abhängt? Wenn ja, dann pimpl.cpp (als Header) müssen beide precede und folgen A.h.- Da man aber immer kann, noch einmal, Gebrauch (void *) und Abgüsse und Inline-Funktionen in Header vorangehenden, es kann getan werden.

Natürlich könnte ich falsch sein. In jedem Fall:. Ick

In meiner langen Karriere, ich habe über Abhängigkeitsmuster nicht kommen, den Kopf nur Implementierung nicht zulassen würde.

Wohlgemerkt, dass, wenn Sie zirkuläre Abhängigkeiten zwischen den Klassen haben, können Sie entweder abstrakte Schnittstelle zurückgreifen müssen - konkrete Umsetzung Paradigma oder Vorlagen verwenden (Vorlagen können Sie zukunftsReferenz Eigenschaften / Methoden der Template-Parameter, die aufgelöst werden später während der Instanziierung).

Das bedeutet nicht, dass Sie immer für Kopf nur Bibliotheken Ziel sollten. Gut, wie sie sind, sollten sie nach Vorlage und Inline-Code reserviert werden. Sie sollten im nicht wesentlich komplexen Berechnungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top