namespaces in java-packages-stiel
-
Hallo Leute,
ich arbeite seit langem unter Java. Nun will ich mich aus bestimmten Gründen in C++ einarbeiten. Auf den ersten Blick erscheint mir das C++ doch sehr chaotisch im Vergleich zu Java

Frage: In Java bin ich es gewohnt jede Klasse in ein package zu packen (dh jede Datei ist entsprechen mit der package-Direktive versehen). Ein package kann mehrere Klassen enthalten (jedoch am besten verteilt auf mehrere Dateien). Nun will ich das auch unter C++ mit den namespaces nachstellen.
zb in Java:
Datei1
package test; class A { // }Datei2
package test; class B { // }ist das Gleiche in C++ wie folgt realisiert:
header1:namespace test { class A { // } }header2:
namespace test { class B { // } }??
Natürlich könnte ich das durch Ausprobieren testen, aber mich interessiert auch die "übliche" Herangehensweise.
Für Eure Antwort wäre ich Euch sehr dankbar.
Mit freundlichen Grüßen
-
Jupp, kannst Du so machen...also namespace's sind ja primär dafür da, dass Namenkonflikte verhindert werden
. (Bin (noch) kein Java-Experte, kann daher nicht sagen, was packages machen bzw. es damit vergleichen
.)
-
Hi Peter,
Du kannst namespaces ebenso zum "Ordnen" verwenden wie packages in Java. Aber es gibt keine "namespace-Zugriffsklasse", d.h. um den Zugriff (private, public, protected) muss sich jede Klasse selbst kümmern.
Gruß,
Simon2.
-
Diese Aufteilung wie in Java gibt es in C++ nicht. Packages haben auch pysikalische Auswirkungen (Package A.B gehört in Verzeichnis A/B), und die hast du in C++ nicht.
In C++ ist es üblich einen Namespace für eine Anwendung oder eine Library zu haben. In Java wird dagegen alles in hunderte verschiedene Packages verteilt. Macht niemand in C++. Schon allein deshalb, weil die IDEs einen nicht dabei unterstützen.
Wenn ich eine Library entwickle, die z.B. Raytracing macht. Dann habe ich dafür meistens einen Namespace - fertig. DIe C++-Standardlibrary ist z.B. in einem einzigen Namespace "std". Wenn du diverse GUI-Library benutzt, sind die gesamten Klassen auch nur in einem Namespace (z.B. sind alle FLTK-Klassen im Namespace "fltk").
-
Eigentlich sind namespace und package sehr unterschiedlich. einmal die verzeichnis sache, dann gibt es sowas wie "namespace private" also "package private" auch nicht und in c++ musst du immer den namespace angeben oder mit using in java bruachst du nur das import was ich mit dem c++ include vergleichen würde.
-
java braucht halt keine "includes", weil das package system sich um alles kümmert. namespaces in c++ ersetzen keine packages. der zugriff gestaltet sich ähnlich, man benötigt entweder den qualifizierten namen einer klasse, um sie verwenden zu können (package.klasse vs. namespace::klasse) oder muss den "namensraum" für den aktuellen scope zugänglich machen (import package.* vs using namespace namespace).
in c++ kann die using declaration allerdings in jedem block, für diesen block, geschehen.man kann namespaces ähnlich wie packages verwenden, ist allerdings nicht üblich. während es in java als "nicht empfehlenswert" gilt, klassen in das globale package zu schubsen, ist das in c++ für stand-alone projekte sehr üblich.
-
Vielen Dank für die zahlreichen Antworten

gut zu wissen, ich hatte schon vorgehabt ein Projekt auf unzählige namespaces und sub-namespaces aufzuteilen

noch eine syntaktische Frage:
In dem von mir o.g. Beispiel sind also Klasse A und B im gleichen namespace "test", richtig? Mich verwirren hierbei die "umschliessenden Klammern". Es sieht dabei so aus, als ob in dem namespace nur das enthalten ist, was in den Klammern eingeschlossen ist. In dem o.g. Beispiel gibts ein "namespace test-Klammerpaar" sowohl in der A.h und der B.h. Ist es der gleiche namespace ?Gruss
-
linu(x)bie schrieb:
noch eine syntaktische Frage:
In dem von mir o.g. Beispiel sind also Klasse A und B im gleichen namespace "test", richtig? Mich verwirren hierbei die "umschliessenden Klammern". Es sieht dabei so aus, als ob in dem namespace nur das enthalten ist, was in den Klammern eingeschlossen ist. In dem o.g. Beispiel gibts ein "namespace test-Klammerpaar" sowohl in der A.h und der B.h. Ist es der gleiche namespace ?Ja, natürlich.
Noch ein Unterschied zu Java-Packages: in C++ sind Namespaces tatsächlich hierarchisch.
-
Danke

finix schrieb:
Noch ein Unterschied zu Java-Packages: in C++ sind Namespaces tatsächlich hierarchisch.
ähm... was heißt das bitte? In java sind doch packages auch hierarchisch. Dabei geht es aus vom Defaultpackage als Wurzel bis zu den einzellnen subpackages, welche keine weiteren enthalten. Das sind die Blätter. Oder was meinst Du?
-
linu(x)bie schrieb:
Danke

finix schrieb:
Noch ein Unterschied zu Java-Packages: in C++ sind Namespaces tatsächlich hierarchisch.
ähm... was heißt das bitte? In java sind doch packages auch hierarchisch. Dabei geht es aus vom Defaultpackage als Wurzel bis zu den einzellnen subpackages, welche keine weiteren enthalten. Das sind die Blätter. Oder was meinst Du?
Soweit ich informiert bin sind die Punkte in
package-Bezeichnern lediglich Konvention.
Im Gegensatz dazu befindet sich hiernamespace javax { namespace swing { //... } } // edit: using namespace javax; swing::foo bar; // gueltiges C++das Package "swing" tatsächlich in "javax".
-
hmm... glaube das ist in dieser hinsicht auch hierarchisch. Der pkt ist keine Konvention, sonder hat sogar eine physikalische Auswirkung. Demmnach ist javax ein Verzeichnis und swing ein Unterverzeichniss (im Dateisystem).
Konstrukte wie:import javax.*;sind möglich. Dies includiert alles im Verzeichnis javax/ bis auf den Inhalt von Unterverzeichnissen. (Vergleichbar mit der using-Direktive in C++).
gruß
-
Nein, die Punkte im Java-Package sind nicht eine Konvention, sondern repräsentieren technisch ein Verzeichnis oder Datei.
java.util zwingt zu java/util
java.util.String zwingt zu java/util/String.javaIn C++ sind Namepaces (wie gesagt) technisch ganz anders. Auch sind sie im Unterschied zu Packages "offen". Man kann Namespaces überall definieren und auch ergänzen. Die geschweiften Klammern sind einfach der Sichtbarkeitsbereich (Scope).
Beispiel:
// in x.hpp namespace hallo { class A {}; }Und:
// in y.hpp namespace hallo { class B {}; }D.h. Namespaces sind offen, da sie überall zus. Typen aufnehmen können. Also am Ende hat Namespace hallo Klasse A und B.
-
Aaah...
Gutes Beispiel.
Danke

-
Artchi schrieb:
Nein, die Punkte im Java-Package sind nicht eine Konvention, sondern repräsentieren technisch ein Verzeichnis oder Datei.
java.util zwingt zu java/util
java.util.String zwingt zu java/util/String.javahallo,
das ist quatsch, packages sind nicht hierarchisch und sind auch nicht zwingend durch unterordner im dateisystem definiert.
-
Ob die in Unterordnern sein müssen weiß ich nicht, allerdings ist es so, dass ansonsten kaum eine Entwicklungsumgebung damit zurecht kommt. Scheint also zumindest Usus zu sein.
Interessanter ist allerdings deine andere Behauptung. Meiner Meinung nach sind Packages schon hierachisch. Es ist zwar nicht der Fall, dass Sub-Packages autom. Zugriff auf ihre Super-Packages haben oder umgekehrt, aber zumindest gliedern sich die Klassen in ein hierachisches Konzept.
MfG SideWinder
-
SideWinder schrieb:
Interessanter ist allerdings deine andere Behauptung. Meiner Meinung nach sind Packages schon hierachisch. Es ist zwar nicht der Fall, dass Sub-Packages autom. Zugriff auf ihre Super-Packages haben oder umgekehrt, aber zumindest gliedern sich die Klassen in ein hierachisches Konzept.
inwiefern "gliedern sie sich in ein hierarchisches konzept" ?
das package a.b hat nix mit dem package a oder dem package a.b.c zu tun