Zeichenkette als Rückgabewert??
-
Neo2k3 schrieb:
Wieso als static deklarieren? Schließlich bedeutet das doch nur, dass der Wert in der Methode erhalten bleibt, oder?

Wie pumuckl schon sagte brauchst du diese Variablen ja nicht in deinem ganzen Programm, deshalt solltest du sie auch in deine Klasse aufnehmen...
Und da als static const deklarieren das sie dann erstens außerhalb der Klasse benutzbar sein können und für alle deine Objekte immer den gleichen Wert haben..Also:
Wenn du zwei Instanzen einer Klasse hast und über eine eine static variable veränderst wird sie auch für das andere Objekt verändert, weil static membervariablen stehen nur EINMAL für jede Klasse im Speicher und gelten für alle Objekte der Klasse
-
Freakcode! Kannste mal bitte aufhören mit den schrecklichen C-Strings rum zu hantieren?
Er hat VC++6 und da gibt es definitiv std::string.
-
Also ich habe das jetzt mal mit std:string gemacht. Aber irgendwie erscheint mir die Umsetzung etwas unprofessionell. Ist es so?
#include <string> #include <iostream> #include <fstream> using namespace std; class File { private: string Pfad; string Daten; public: File(string TempPfad) { Pfad = TempPfad; Daten = ""; } void Save(string TempDaten) { Daten = TempDaten; ofstream AusgabeDatei(Pfad.c_str()); AusgabeDatei << Daten; } const char *Load() { ifstream EingabeDatei(Pfad.c_str()); while (!EingabeDatei.eof()) { getline(EingabeDatei, Daten, ' '); } return Daten.c_str(); } }; void main() { string Daten; File FH("c:\\test.txt"); FH.Save("test"); Daten = FH.Load(); cout << Daten << endl; }
-
#include <string> #include <iostream> #include <fstream> // im Header-File niemals using namespace! class File { private: std::string Pfad; std::string Daten; public: // const String-Referenz entgegen nehmen. Ist einheitlicher. File(const std::string &TempPfad) { Pfad = TempPfad; Daten = ""; // nicht nötig, string initialisiert sich autom. mit nichts. } void Save(const string &TempDaten) { Daten = TempDaten; ofstream AusgabeDatei(Pfad.c_str()); AusgabeDatei << Daten; } const std::string& Load() { // constante Ref auf string zurück geben. ifstream EingabeDatei(Pfad.c_str());nötig! while (!EingabeDatei.eof()) { getline(EingabeDatei, Daten, ' '); } return Daten; // .c_str() nicht nötig! } }; void main() { File FH("c:\\test.txt"); FH.Save("test"); std::string Daten = FH.Load(); // Variablen erst dann deklarieren, wenn sie gebraucht werden. cout << Daten << endl; }C-Strings (char-Pointer) würde ich garnicht zurück geben. Wer aus dem std::string einen C-String benötigt, kann sich den selbst per .c_str() raus holen. Wenn du C-Strings zurück gibst, wird wahrscheintlich der benutzer deiner Klasse (vielleicht du selber) wieder in std::string umwandeln müssen. Voll nervig.
-
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: