Wenn ein namespace oder ein struct?
Ich war gerade das Lesen ein wenig auf Sie aus http://www.cplusplus.com/doc/tutorial/namespaces/
und wie es scheint, eine Struktur, die fähig ist, die gleichen Dinge? Oder sogar eine Klasse für diese Angelegenheit. Vielleicht ist hier jemand besser definieren, was ein namespace ist, und wie unterscheidet es sich von einer Struktur/Klasse?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Namespaces und Klassen-Typen sind nicht in der Lage, die gleichen Dinge. Namespaces sind vor allem die Gruppen-Typen und-Funktionen zusammen, um zu vermeiden Kollisionen mit Namen, die, während Klasse-Typen halten von Daten und Operationen, die auf diese Daten.
Nur die Gruppe Funktionen und Objekte durch die Verwendung eines Klasse-Typen, die Sie haben würden, um Sie statisch:
Ohne
static
hätten Sie zum erstellen von Instanzen der Klasse-Typen zu verwenden. Ein namespace ist viel besser geeignet, hier:Andere wichtige Sache sind
using
Erklärungen und Richtlinien:Mit Klasse-Typen es gibt einfach keinen Mechanismus, der es erlaubt, dass.
Welche Klasse-Typen geben, die Sie über die namespaces ist, dass Sie können mehrere Instanzen mit unterschiedlichen Staat - wenn Sie das brauchen, in einer Klasse-Typ.
struct X { // create an explicit-only namespace
Gut, scheint, jeder geht auf Sie, also werde ich meine eigenen Argumente.
Erste Sachen zuerst,
namespace
undstruct
sind völlig verschiedene Tiere: Sie haben unterschiedliche syntax und unterschiedliche Semantik.Klar:
struct
führt eine Art, die Sie verwenden können, die als Vorlagen argumentnamespace
können verteilt werden in mehreren DateienSyntaktisch:
namespace ns = mylong::name::space;
und struct mittypedef mylong::name::Space lilstruct;
Semantisch:
namespace
definiert nur einen Rahmen für die definition von Symbolen, die es erlaubt, gruppieren von Objekten, die zusammen arbeiten (Klassen-und free-Funktionen) isolieren, während Sie für den rest der Welt (name clashes). Als solches ist es oft stellt eine logische Einheit der Arbeit im Projekt (für kleine Projekte, es ist ein einziger namespace).struct
oderclass
definiert eine logische Bindung zwischen Daten und Methoden auf Sie einzuwirken, das ist der Grundstein der Kapselung. Es hat in der Regel eine klare Verantwortung und eine Reihe von Invarianten.Beachten Sie, dass manchmal ein
struct
oderclass
wird nur verwendet, um zusammen zu binden Objekte, die zusammen arbeiten, ohne jede Logik, zum Beispielstruct Person { std::string name, firstName; };
.Dass gesagt wird: es gibt keinen Punkt in C++ für eine
struct
vonstatic
Methoden. Es ist nur eine perversion von Java-oder C# - und Ihre "reinen" OO-Ansatz. Unterstützt C++ freie Funktionen, so gibt es keinen Punkt, nicht mit Ihnen, vor allem, da es besser für die Kapselung (Sie don ' T haben Zugang zu einem privaten/geschützten Teile, so dass Sie nicht mess up eine invariante, und Sie verlassen Sie sich nicht auf die Darstellung der Klasse).Beim erstellen Ihrer eigenen Bibliothek, ist es in der Regel gute Praxis, namespace alle exportierten Funktionen und Klassen.
So, wenn jemand schließt Ihre Bibliothek, die Sie nicht verschmutzen Ihren namespace, und es ist weniger Wahrscheinlichkeit von name-clashes.
Wenn es getan werden kann, mit einem namespace ein namespace.
Eine Struktur, die viel mehr tut, als die Definition von Bereichen. Es wird ein Typ definiert.
boost::bind()
aber Sie haben zu sagenboost::assign::list_of()
? Entweder immer ein Projekt in einem namespace der eigenen, oder nie do -- so werden Ihre Benutzer intuitiv verwenden Sie Ihre Namen richtig auf dem ersten Versuch.In C++ ein struct ist genau das gleiche wie eine Klasse, mit der Ausnahme structs standardmäßig public sind. Klassen sind privat. Also, wenn Sie wollen, zu Gruppe Kostenlose Funktionen zusammen einen Namensraum benutzen. Wenn Sie möchten, gruppieren von Daten und Funktionen, verwenden Sie eine Struktur/Klasse, und Optional einen namespace drumherum.
Beachten Sie, dass Wenn Sie Ihre Funktionen in ein struct ist, dann würden Sie eine Instanz Ihrer Struktur, wenn Sie wollen, rufen Sie diese Funktionen, es sei denn, Sie sind statisch.
Wenn Sie nicht wollen, dass die Leute die "mit" - feature von C++ mit der Klasse, die werden kann gefährlich und wird oft schlecht beraten in komplexen code, dann gehen Sie vor und verwenden Struktur mit Statik.
In anderen Worten: wenn Sie Ihre Funktionen sollten immer bezeichnet werden mit "group::function", dann können Sie die box in Ihrer Benutzer, indem Sie erklärt, wie eine struct.
Darüber hinaus, und wichtiger, können Sie vorwärts-erklären Strukturen, die in älteren Versionen von C++. Sie dies nicht mit namespaces, bis C++ 11.
Betrachten:
In diesem Fall, dass die Benutzer angeben, zip:: macht Sinn. Es ist eine kurze, spezifische und informativ. Und die Namen der zugrunde liegenden Funktionen mehrdeutig sind, ohne es. Verwenden Sie eine Struktur mit Statik.
Betrachten:
Diese sollte auf jeden Fall in einem namespace. Der namespace-name zu lang ist, und sinnlose, wahrscheinlich mehr zu tun mit der Organisation, wer ist die Aufrechterhaltung der es - und das ist gut... aber wirklich, es sollte ein namespace... nicht eine Struktur.