Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Hilfe Konstruktorfunktion setzen static bool funktioniert nicht

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 <
010
07.01.2008, 22:45 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja, wohl daher das man in größeren projekten einfach mit mehr namespaces arbeitet, und da kanns schnell passieren das du string aus std, aus nsA und nsB brauchst, und scho musst dus eh wieder hinschreiben ;-)
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
07.01.2008, 22:54 Uhr
0xdeadbeef
Gott
(Operator)


Naja, using namespace geht dem, was Namensräume erreichen sollen, völlig zuwider, das ist das grundsätzlichste Problem. Wenn jetzt eine andere Bibliothek das gleiche Symbol verwendet, läufst du damit in Probleme.

Davon abgesehen aber holt using namespace neben den Symbolen, die du brauchst, noch eine ganze Menge mehr in den globalen Namensraum, im Fall von using namespace std; unter anderem Implementierungsdetails der Standardbibliothek - also weißt du im Endeffekt nie genau, wann du in Namenskonflikte laufen kannst.

Die Meinungen gehen etwas auseinander, wenn es um mögliche Anwendungsgebiete von using-Direktiven geht. Allgemeiner Konsens ist, dass using in Headerdateien nichts verloren hat, weil du nie weißt, wo sie nachher mal eingebunden werden. In Source-Dateien sieht man es gelegentlich mal, besser ist allerdings, wenn man sie schon benutzt, sie auf Funktionen zu beschränken, also

C++:
int main() {
  using namespace std;

  ...
}


Das Problem verschwindet dadurch nicht vollständig, aber zumindest ist sein Wirkungsbereich dadurch eingeschränkt. Etwas besser ist es, die importierten Symbole direkt anzugeben, also

C++:
int main() {
  using std::cout;
  using std::endl;

  cout << "Hello, world." << endl;
}


Dadurch verschwindet das Problem möglicher Überlappungen mit anderen Bibliotheken zwar auch nicht vollständig, aber zumindest holst du dir keine unbekannten Symbole. Nur kann eine solche Liste mitunter recht lang werden, und du siehst trotz allem nicht auf einen Blick, aus welcher Bibliothek das Symbol denn jetzt kommt.

Ich für meinen Teil bevorzuge es allerdings, die Symbole gleich komplett auszuschreiben, oder bei langen Namensraumnamen namespace aliases zu definieren - zum Beispiel bei boost.filesystem

C++:
int main() {
  namespace fs = boost::filesystem;

  fs::path my_path("/foo/bar"); // fs::path == boost::filesystem::path
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
07.01.2008, 23:08 Uhr
DirkS



Ok ich verstehe, allerdings sind dann die aliase die man ggf. definiert hat kein pro für die Lesbarkeit wenn jemand anderes den code "durchgeht".
Ich muss zugeben das Problem mit den Überlappungen mit anderen libs finde ich wirklich interessant, gerade wenn man nicht soviel Ahnung hat wie ich!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
07.01.2008, 23:39 Uhr
0xdeadbeef
Gott
(Operator)


Naja, es ist ja nun typischerweise nicht so, dass man besonders lange Funktionen hat (Jedenfalls nicht, sobald man einmal aus dem Anfängerstadium raus ist ), also sieht man die Alias-Definition am Anfang der Funktion in aller Regel noch.

Erfahrungsgemäß machen namespace-Aliases den Code durchaus lesbarer, zumindest, wenn sie sprechend gewählt sind. Stell dir zum Beispiel mal bei einem Boost.Spirit-Parser vor, du schriebst den namespace immer komplett aus. Das sähe dann zum Beispiel in etwa so aus:

C++:
boost::spirit::rule<scanner_t, boost::spirit::parser_context<>, boost::spirit::parser_tag<word_id> > word = boost::spirit::access_node_d[boost::spirit::leaf_node_d[boost::spirit::as_lower_d[boost::spirit::lexeme_d[boost::spirit::anychar_p]]]][some_assigning_actor];


...und jetzt sag mir, dass das übersichtlich ist.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
07.01.2008, 23:46 Uhr
DirkS



ja das scheint einleuchtend :-)

Aber würde man in diesem Fall den alias im entsprechenden header definieren anstatt in der Implementierung, oder würdest Du strikt dabei bleiben davon abzusehen? In dem Falle will man doch selbst den alias , der ja zumindest einmal definiert werden muss im header definieren oder?

Dieser Post wurde am 07.01.2008 um 23:47 Uhr von DirkS editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
07.01.2008, 23:59 Uhr
0xdeadbeef
Gott
(Operator)


Ich definier den namespace alias in der Funktion, in der ich ihn benutze. In Headerdateien schreib ich den Kram immer aus - da ist das auch weniger problematisch, weil du selten den selben namespace-Bezeichner öfter als einmal in einer Deklaration brauchst.

Es ist wahrscheinlich weniger problematisch als using-Direktiven, das in einem Header zu machen, aber im Grunde gilt das Problem, dass du nicht weißt, wo der Kram mal eingebunden wird, immer noch - wenn jetzt eine andere Header-Datei das selbe Alias oder einen gleichnamigen Namensraum definiert, kriegst du wieder Probleme. In diesem Fall auch, wenn das Alias in zwei eingebundenen Headern den gleichen Namensraum bezeichnet - und das kann dir sogar innerhalb des selben Projektes passieren. Also besser sein lassen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 08.01.2008 um 00:00 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: