string und ofstream in header definieren



  • wenn ich schreibe
    std:string;
    kommt bei mir:
    "error: deklaration does not declare anything"



  • ...



  • @swordfish: mein ich doch! ich habs im code auch mit :: geschrieben, aber trotzdem kommt dann eine fehlermeldung. wenn ich im header jetzt aber schreibe using namespace std;
    funktioniert es.

    1. warum?
    2. wie funktioniert das mit den namespaces überhaupt? ich blick da nicht durch!


  • ok, jetzt hab ich verstanden, wie ihr das meint. ich hatte std::string mit
    using std::string verwechselt und das alleine geschrieben. aber trotzdem versteh ich nicht, wofür ich diese namensräume brauche 😞



  • NIE USING NAMESPACE XY IM HEADER AUßER DU HAST EINEN SEEEEHR GUTEN GRUND!
    Zu den Namespaces:
    Früher in C hatte man einen Konflikt, wenn man etwas (Variable/Funktion/...) genau so nannte, wie eine bereits vorhandeen Variable/Funktion/... .
    Das lag daran, dass die Namen nicht gleich sein dürfen.
    In C++ gibt es einen einfachen Weg zur Vermeidung von solchen Konflikten: die Namespace.
    Eine Funktion foo im Namespace bar heißt nicht mehr foo, sondern bar::foo.
    Das heißt, dass du/ein anderer Programmierer im globalen Namespace (wenn du keinen verwendest) oder in einem anderen Namespace ebenfalls eine Funktion foo definieren können. Bsp:

    void foo(); In Ordnung, foo existiert nicht
    
    int foo; // Fehler: foo ist bereits der Name der Funktion
    
    namespace bar
    {
        void foo(); // In Ordnung: innerhalb dieses Namespace existiert foo nicht
    
        int foo; // Fehler: In diesem Namespace existiert bereits foo
    }
    
    namespace bar2
    {
        void foo(); // In Ordnung: innerhalb dieses Namespace existiert foo nicht
    }
    
    int main()
    {
        foo(); // Foo aus dem globalen Namespace
        bar::foo(); // Foo aus bar
        bar2::foo(); // Foo aus bar2
    }
    

    Weil häufig keine Namenskonflikte entstehen, kann man mit using namespace bar; einen kompletten Neamespace "einschalten", man muss dann nicht mehr bar::foo schreiben, sondern kann direkt foo verwenden.
    Das führt allerdings zu Fehlern, wenn (wie im Beispiel) ein Namenskonflikt auftritt.

    Die Standardbilbiothek nutzt dieses Verfahren, indem sie alles in den namespace std gepackt hat.
    Entweder du schreibst vor jeder Funktion std:: oder nutzt using namespace std; um dir die Tipparbeit zu sparen (mache es trotzdem nicht!).



  • ...



  • Dankeschön erstmal, soweit hab ich das jetzt verstanden. Heißt das also, dass z.B. cout im namespace std steht? das hab ich mich nämlich auch immer gefragt, wofür ich noch diesen namespace brauche, wenn cout doch schon durch
    #include <iostream>
    bekannt sein sollte. Ist das so richtig?



  • @swordfish: hab ich doch schon vorher: "deklaration does not declare anyting". aber ich werd mir merken, es ab jetzt SOFORT zu schreiben 🙂



  • Neulich gab es doch mal die Diskussion, was Informatiker eigentlich machen/warum alle ein falsches Bild haben. Ich meine gelesen zu haben, dass jemand geschrieben hat, dass die Leute in Zukunft Informatiker für Hacker halten werden, die jede Kaffeemaschine fernsteuern können.
    Das Bild ist jedenfalls falsch.
    Für die normalen Leute sind Informatiker welche, die hellsehen können/jeden Rechner pausenlos unter Beobachtung haben und ohne irgendwelche Infos den Fehler sagen können. 🙄

    Edit: @TE: Ja, das ist richtig, mache mal Rechtsklick auf einen Std-Header, Header öffnen oder so (je nach IDE) und schaus dir selber an.



  • ok, dankeschön



  • MalteS schrieb:

    Der header sieht jetzt so aus:

    #ifndef HEADER_H
    #define HEADER_H
    #include <iostream>
    #include <fstream>
    #include <string>
    // anderer kram
    string laufzeit;
    bool beenden = false;
    ofstream ziel("laufzeit.txt");
    int rechner(float, int, int, int);
    #endif
    

    Lerne den Unterschied zwischen Deklaration und Definition. Dann lies im Buch deiner Wahl die One-Definition-Rule nach. Dann wirst du verstehen, dass das, was du hier vor hast, Käse ist.

    std::string laufzeit;
    bool beenden = false;
    std::ofstream ziel("laufzeit.txt");
    

    Sind Definitionen, die in einem Header typischerweise nichts zu suchen haben. Möchtest du daraus Deklarationen machen, sieht das dann so aus:

    extern std::string laufzeit;
    extern bool beenden;
    extern std::ofstream ziel;
    

    Aber am besten gewöhst du dir gleich ab, so viele globale Variablen zu nutzen ...


Anmelden zum Antworten