Zeichenkette als Rückgabewert??



  • void main() {
    
        File FH("c:\\test.txt");
        FH.Save("test");
    
        cout << FH.Load() << endl; // Variable und ne Zeile gespart. ;-)
      }
    


  • Wenn ich namespace weglasse gibt es sehr viele Fehler, u.a. wird cout als nichtdeklariert bezeichnet. 🙄
    Außerdem muss ich vor die Datei-Handlings, d.h. of- und ifstream ein std:: setzen, sonst klappt das auch nicht.

    Warum ist das denn so wichtig dass man namespace oben weglässt?



  • Ok, sorry, war auch mein Fehler, hab nicht überall in meinem Beispiel das std:: hingeschrieben, das mußt du natürlich noch machen (sollte halt selbstverständlich sein, hatte mich dann nur auf std::string konzentriert!).

    In Header-Files soll man kein using namespace setzen, zumindest nicht global, weil die Headers ja includiert werden. Wenn Header-File-1 ein using namespace X benutzt, und danach Header-File-2 angehängt wird, wird der Namespace X dort auch benutzt. Und dann kann es zu Fehlern kommen. Wenn du using namespace schreibst, dann nicht global.

    Also innerhalb von main() könntest du using namespace benutzen.



  • Das Problem ist ja, dass jetzt z.B. cout nicht mehr funktioniert.



  • Neo2k3 schrieb:

    Das Problem ist ja, dass jetzt z.B. cout nicht mehr funktioniert.

    Dann qualifizier den Namensbereich eben, d.h. pack ein 'std::' davor. Oder tu was Artchi Dir gesagt hat und füge 'using namespace std' in Deine 'main'-Methode ein.



  • ok, wenn ich vor cout und endl auch ein std schreibe gehts. Ich werd mich noch mal schlau machen müssen über diese std-Klasse. Gibts da irgendwo ein gutes Tutorial??

    Ansonsten danke für eure Hilfe 🕶



  • 'std' ist keine Klasse sondern ein Namensbereich, der alle Klassen und Methoden der Standardbibliotheken von C++ umfasst.

    Mit anderen Worten: Alles, was irgendwo in den Headern der Standardbibliothek deklariert ist, befindet sich im Namensbereich 'std'. Um diese Typen also zu benutzen, muss man diesen Namensbereich "betreten". Das geht auf vier verschiedene Weise:

    1. Durch Erweitern des Namensbereichs:

    namespace std {
        // hier kann alles aus 'std' verwendet werden, ohne es explizit zu sagen
    
        void foo()
        {
            cout << "Ich bin in std" << endl;
        }
    }
    

    2. Durch explizites Qualifizieren bei jedem Benutzen:

    void foo()
    {
        std::cout << "Ich benutzte std explizit" << std::endl;
    }
    

    3. Durch Benutzen des Namensbereichs ('using'-Direktive):

    void foo()
    {
        using namespace std;
        cout << "Ich benutzte std implizit" << endl;
    }
    

    4. Durch Benutzen von Namen innerhalb des Bereichs ('using'-Deklaration):

    void foo()
    {
        using std::cout;
        // Achtung: 'cout' braucht keine Qualifizierung von 'std', 'endl' braucht sie!
        cout << "Ich benutze std::cout" << std::endl;
    }
    

    Ich hoffe, das macht es klarer.



  • Jo verstanden!!
    Aber wieso konnte ich vorher ohne irgendeine using-Direktive oder explizite Anweisung cout und endl benutzen und jetzt auf einmal nicht mehr??



  • Ahh ich habs:
    Vorher hatte ich als Header die iostream.h eingebunden und jetzt nur noch iostream nach dem Standard.
    http://tutorial.schornboeck.net/groessten_luegen.htm



  • Neo2k3 schrieb:

    Jo verstanden!!
    Aber wieso konnte ich vorher ohne irgendeine using-Direktive oder explizite Anweisung cout und endl benutzen und jetzt auf einmal nicht mehr??

    Vorher hattest Du doch ziemlich am Anfang des Codes 'using namespace std' stehen, oder? Das galt dann für den gesamten nachfolgenden Code.

    Das Problem hierbei: Es gilt eben wie gesagt für den gesamten nachfolgenden Code und das ist eigentlich meistens nicht wünschenswert.



  • Ich empfehle dir ein vernünftiges Buch in dem mal alles genau beschrieben wird. Aber das Tutorial von Schornboeck.de ist sehr gut, aber eines dieser Bücher ist trotzdem zu empfehlen:

    http://www.kharchi.de/cpp_buecher.html


Anmelden zum Antworten