Singleton Verstaendnisproblem
-
Nexus schrieb:
~john schrieb:
Ob das unnötig ist, kann man nur über den Kontext entscheiden, denn folgendes ist ein legales C++ Programm.
Seit wann darf man eigene Namespaces mit Namen
stdeinführen? Ich dachte, das wäre nur für Template-Spezialisierungen erlaubt. Oder bezieht sich das nur auf globale Namensräume?Abgesehen davon, wer würde so etwas tun? Kaum jemand, zumindest nicht mit gutem Grund. Und genau deshalb würde ich die
::am Anfang auch weglassen. Oder schreibst du das vor jeden Namensraum-Bezeichner?Nein, aber streng genommen müsste man es...
du kannst deine namespaces nennen, wie du willst... (darfst nur im "äußeren" std nichts ändern), aber was ~john geschrieben hat, ist durchaus in ordnung...bb
-
Seit wann darf man eigene Namespaces mit Namen std einführen? Ich dachte, das wäre nur für Template-Spezialisierungen erlaubt. Oder bezieht sich das nur auf globale Namensräume?
Sobald du was eignes in den namespace std einführst, gilt es nicht mehr als Standardkonformes Programm. Respektive die Standardbibliothek muss nicht mehr unbedingt konform arbeiten. Man überlege sich nur mal, dass man eine Klasse schreibt, die "zufälligerweise" den gleichen Namen hat, wie etwas, was in der std. lib benutzt wird und das überdeckt. Kann böse folgen haben.
-
myspace::std!=::std
-
Tachyon schrieb:
myspace::std!=::stdJa, das ist klar. Habe nie das Gegenteil behauptet.
btw:
Als ich die Bezeichnung myspace gesehen habe, musste ich durchaus schmunzeln.
-
Nexus schrieb:
Seit wann darf man eigene Namespaces mit Namen
stdeinführen?Man darf "::std" nicht verändern, ich führe aber eine eigene String Klasse in "::myspace::std" ein, und das ist nun einmal nicht "::std". Die führenden "::" geben eine absolute Namensraumbezug an. D.h. "::std::string" ist garantiert die Stringklasse aus der ISO Norm, wohingegen "std::string" das nicht sein muß. Hier hängt es vom sogenannten Koenig-Lookup ab, welche Klasse genommen wird.
Nexus schrieb:
Abgesehen davon, wer würde so etwas tun? Kaum jemand, zumindest nicht mit gutem Grund. Und genau deshalb würde ich die
::am Anfang auch weglassen.In der Regel kann man das gefahrlos tun, aber es gibt Zusammenhänge, in denen dies notwendig ist. Zum Beispiel wenn man den new operator überlädt.
-
Okay, dann ist das Erstellen eigener Namensräume
stdalso nur auf globaler Ebene nicht gestattet. Trotzdem kann ich mir nicht vorstellen, dass jemand aus Spass einen eigenen Namespacestd(wenn auch innerhalb eines anderen, z.B.myspace) erstellt, zumal ja auch die Möglichkeit vonusing namespace myspace;in Betracht gezogen werden muss.Halt wieder so ein Fall, wo man das :: eigentlich ruhig weglassen kann, und einem nur etwas passiert, wenn man absichtlich schlecht programmierte Konstrukte und böse Namensräume benutzt...
-
Nexus schrieb:
...Trotzdem kann ich mir nicht vorstellen, dass jemand aus Spass einen eigenen Namespace
std... erstellt, zumal ja auch die Möglichkeit vonusing namespace myspace;in Betracht gezogen werden muss...Du hast wohl noch nie mit Entwicklern gearbeitet die Abkürzen wo nur möglich. Dann ist std garkein so unwahrscheinliches Konstrukt (und zudem werden diese Entwickler auch using namespace in Mengen verwenden und dann über die "fehlerhaften" C++ Bibliotheken schimpfen, und das es ohne Namensräume und mit kriptischen Bezeichnern ja viel besser war).
cu André
-
asc schrieb:
Du hast wohl noch nie mit Entwicklern gearbeitet die Abkürzen wo nur möglich.
Nein, nicht wirklich. Ich kenne zwar die Tendenz, möglichst kurze (aber nicht bereits vergebene) Bezeichner zu wählen.
Aber wie kann man auf die Idee kommen, einen eigenen Namenraum
stdzu erstellen? Von mir aus irgendwelche kryptischen, nichts aussagenden Bezeichner, aberstd?asc schrieb:
[...] und dann über die "fehlerhaften" C++ Bibliotheken schimpfen, und das es ohne Namensräume und mit kriptischen Bezeichnern ja viel besser war).
Vielleicht wäre C etwas für die.

-
Nexus schrieb:
Aber wie kann man auf die Idee kommen, einen eigenen Namenraum
stdzu erstellen? Von mir aus irgendwelche kryptischen, nichts aussagenden Bezeichner, aberstd?Die Abkürzung std kenne ich außerhalb von C++ stellvertretend für Standard. Nun schiebt einer vielleicht die Allgemeinen Programmteile in einen Namensraum, und dort halte ich die Abkürzung std nun wirklich nicht für Außergewöhnlich (Neben Core, Base...).
Nexus schrieb:
asc schrieb:
[...] und dann über die "fehlerhaften" C++ Bibliotheken schimpfen, und das es ohne Namensräume und mit kriptischen Bezeichnern ja viel besser war).
Vielleicht wäre C etwas für die.

Ooooohhhhh jaaa. ;P
-
asc schrieb:
Die Abkürzung std kenne ich außerhalb von C++ stellvertretend für Standard. Nun schiebt einer vielleicht die Allgemeinen Programmteile in einen Namensraum, und dort halte ich die Abkürzung std nun wirklich nicht für Außergewöhnlich (Neben Core, Base...).
Naja, wenn das wirklich so ist... Jeder C++-Programmierer sollte eigentlich die Standardbibliothek kennen und somit wissen, dass
stdreserviert ist und dessen eigene Einführung früher oder später zu Namenskonflikten führt. Denken viele Programmierer so kurzfristig? Ich kann nicht wirklich nachvollziehen, dass man trotz allem einen eigenen Namensraum einführt, der sich mit bereits existierenden (und dann noch allgegenwärtigen) Namespaces überschneidet...
-
@unskilled
Die Log-Klasse sollte eine html-Logdatei erstellen. Deswegen benutze ich bei den enum-Werten die Hexadezimale schreibweise. Bei demoperator=habe ich nur die Deklaration in der Header-File ohne die Definition in der .cpp Datei
.Bei dem NumToString Template habe ich es so wegen der named return value optimization geschrieben. Bei der statischen Methode HtmlLog() hatte ich mich nach dem Meyer-Singleton orientiert. Nur habe statt
static Singleton& GetInstanz() { // Die Instanz wird erst beim ersten Aufruf erzeugt. // Endet das Programm, wird Instanz vernichtet. static Singleton Instanz; return Instanz; }static Log& HtmlLog() { static Log Instance; return Instance; }geschrieben.
@sqrt(-1)
Da ich noch am Lernen bin(bitte nicht hauen) kann man mit anonymen Namensraeumen Singleton-Klassen oder globale Instanzen von Klassen ersetzen? Sind sie nicht auf die eine Uebersetzungseinheit beschraenkt?@Kurz nebenbei
Werde es mir abgewoehnen.
thx fuer die Antworten.