header???



  • mmmh cstoll

    das mit dem alten / neuen compiler - ok - is klar

    aber das mit dem namensraum und dem std - das versteh ich grad irgendwie nich..... mir is wohl aufgefallen, dass manche eine ausgabe per cout, manche jedoch mit std::cout programmieren. wieso, weshalb, habe ich noch nicht verstanden - zumindest war mir kein grundlegender unterschied ersichtlich.

    also - was genau meintest du mit definition im namensraum std??

    *lächel*



  • die "neuen" header (die auch nicht mehr soo neu sind) wurden in einen namensraum gelegt, damit sie nicht mit den noch funktionierenden alten kollidieren.

    (stell dir einfach in bezug auf namensräume einfach räume in eimem haus vor. es kann in einem haus zwei renates geben, die eine in raum 303, die andere in raum 404.)

    der namensraum heißt std.

    du kannst ihn entweder für das gesamte programm einbinden

    #include <iostream>
    using namespace std;
    

    oder vor jedes einzelne

    #include <iostream>
    
    ...
    std::cout
    

    :: nennt man manchmal bereichszugriffoperator, üblicherweise engl. scopeoperator.

    hier noch ein hervorragender link:
    http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=iostream#Answ



  • c++ bietet namensraeume, so genannte namespace an. Wie genau du die erstellst brauchst du ja jetzt noch nicht gleich, sagen wir einfach: du kannst z.B 2 Funktionen mit dem gleichen Namen und den gleichen Parametern erstellen, wenn diese in unterschiedlichen namespaces liegen.

    Und alles, was zum STanDard gehoert liegt eben im namespace std.

    Ein Namespace wird angesprochen indem man namespace::whatever schreibt, also fuer das standard cout std::cout. Du kannst aber auch fuer die gesamte Uebersetzungseinheit einen namespace den du nuzten willst festlegen, um dirSchreibarbeit zu sparen, indem du "using namespace std;" schreibst. Danach kannst du einfach cout schreiben und kannst das std:: weglassen.

    Zu spaet war ja klar...



  • aaah - heißt also wenn ich using namespace std verwende, erspar ich mir lästige tipparbeit

    ich glaub - das hab ich auch verstanden 🤡)



  • später wirst du vor jedem 'element' den ensprechenden namespace aufmachen ...



  • Namensräume sind in C++ definiert worden, um zusammenhängende Klassen/Funktionen/whatever gruppieren zu können. Auf diese Weise kannst du einen Namen unabhängig in verschiedenen Zusammenhängen definieren.

    ein Beispiel:
    Ich baue mir eine Arithmetik-Bibliothek und spendiere der einige Template-Klassen matrix<class,int,int> , vector<class,int> etc. Für sich alleine funktioniert diese Bibliothek ganz gut, aber leider gibt es in der STL auch eine Klasse vector<> - und schon sind Konflikte vorprogrammiert. Natürlich könnte ich jetzt meine Klassen umbenennen in CMatrix, CVector,..., aber das hat dann wieder woanders Probleme.
    Die bessere Lösung sind Namensräume - ich lege alle meine Klassen in den Namensraum CS_math und schon gibt es keine Konflikte mehr zwischen CS_math::vector und std::vector (die Klassen der STL sind alle im Namensraum std).

    (und wenn dir dieses ständige "std::" zu mühselig ist, setzt du an den Anfang des Programms ein using std::vector; (für einzelne Namen) oder using namespace std; (für ALLE Namen des Namensraumes) und schon kannst du die Klassen ohne die NR-Zuordnung verwenden - allerdings mit dem unerwünschten Nebeneffekt, daß du dir die Namenskonflikte zurückholst, die durch die Namensräume aufgeräumt werden sollten)



  • ähm - langsam - jetzt bin ich wieder ausgestiegen *sorry*

    also - gruppieren heißt in diesem fall - ich habe beispielsweise 5 funktionen - die alle auf den gleichen namensraum zugreifen, ich mir also wie in unserem beispiel dieses lästige std in jeder nötigen zeile dieser 5 funktionen sparen kann. richtig?

    mit den template-klassen kann ich irgendwie noch nich so wirklich was anfangen - d.h. ich habe ein bißchen schwierigkeiten dein beispiel nachzuvollziehen. mir sind noch die begriffe matrix, vector, stl, etc fremd im zusammenhang mit dem programmieren von c++.

    ich glaube (!), am ende des beispiels wolltest du mir noch erklären, dass ich, wenn ich using namespace std; für alle namen des namensraums definieren würde, wieder die anfangsschwierigkeiten haben würde, die vermieden werden hätten sollen.... richtig?

    sollten meine beiden vermutungen richtig sein - so fehlt mir doch irgendwie die mitte.... aber das wird wohl normal sein bei meiner vorkenntnis befürchte ich.



  • Gruppieren heißt in dem Fall, daß logisch zusammenhängende Klassen in einen gemeinsamen Namensraum gepackt werden. In dem Beispiel von mir landen die Klassen vector<>, matrix<> und noch einige andere in meinen Namensraum CS_math und die Klassen der Standardbibliothek im vorgegebenen Namensraum std.
    (und damit können sich meine Klasse vector<> (die einen Vektor im mathematischen Sinn darstellt) und die Standard-Klasse vector<> (ein dynamisch erweiterbares Array) gefahrlos aus dem Weg gehen)



  • Sie greifen nicht auf den gleichen namensraum zu sondern BEFINDEN sich dort. Und \die Erklaerung von CStoll hat nichts mit Templates zu tun, er hat eben nur gerade diese beiden Klassen genommen, kannst du durch alles moegliche ersetzen.

    Ein Beispiel: ich will mir aus irgendeinem Grund ein eigenes cout oder cin schreiben, das nicht das selbe macht wie die beiden standard. So, wenn es jetzt keine namensraeume gaebe koennte ich diese Klassen nicht cin oder cout nennen... schliesslich gibt es sie schon! anstatt dass ich mir nun aber neue Namen ausdenken muss, und wieder neue weil es ein problem mit andern gibt die ich mir schon ausgedacht habe mache ich mir einfach einen namespace shinja. Und wenn ich jetzt mein cout verwenden will schreibe ich shinja::cout, will ich hingegen das aus dem standard verwenden schreibe ich std::cout, und schon ist die Sache in Ordnung.

    Zusaetzlich gibt es eben noch die Sachen wie using std::cout; das bewirkt dann dass immer das std::cout verwendet wird... moechte ich das jetzt umaendern auf mein eigenes aendere ich es in shinja::cout; und schon sind ALLE couts durch meins ersetzt (falls das erwuenscht ist ganz praktisch)

    Ich hoffe das war verstaendlich, auch wenn eh jetzt wenn ich das absende schon ein anderer geantwortet hat...



  • ah - jetzt ja. ich glaub ich habs. die problematik ist klar - die möglichkeiten auch - nur der nutzen noch nicht so... aber ich denke, das werd ich schon rausfinden, wanns mir helfen kann.

    tut mir wirklich leid - dass man hier von gaaaanz unten anfangen muss zu erklären - aber ich finde, ihr macht das total super! und ich bin bei so netten, vielen, schnellen und vorallem anschaulichen erklärungen von euch echt guter dinge. hoffe, ich kann auch irgendwann mal in diesem forum fragen an gänzlich unwissende beantworten, wie ihr jetzt für mich.

    so - ich wühl mich mal weiter durch die header-geschichte und meld mich beim nächsten verzweiflungspunkt wieder. vielleicht kann ich dann ja schon mal einen kleinen code-auszug posten beim nächsten problem....

    danke-danke-danke nochmal - bis später 🤡



  • namespaces machen nichts großartiges.

    Zwei Firmen die sich nicht kennen: Wenn Firma A in London ein Programm schreibt, packen die alles in den Namespace A rein. Wenn Firma B in Paris ein Programm schreibt, packen die alles in Namespace B rein.

    Jetzt erfährt Firma A von Firma B, und sagt: ich will die coolen Klassen von Firma B auch benutzen, weil die ein paar coole Sachen gemacht haben, entstehen keine Nameskonflickte, falls beide Firmen zufällig gleiche Funktions-/Klassennamen benutzt haben, obwohl die Dinger unterschiedliche Aufgaben erfüllen. Einen anderen größeren Nutzen gibt es eigentlich nicht.


Anmelden zum Antworten