STL-Problem
-
Hallo zusammen,
ich versuche in einer Klasse den Pointer für einen File zugriff zu globalisieren, weiss aber nicht wie, kann mir jemand helfen?
Mein Code://--------------------------------------------------------------------------- #include <vcl.h> #include "tgsd.h" #include <fstream.h> ofstream Stream_glbl; // globaler Speicher des File-Pointers //--------------------------------------------------------------------------- #pragma package(smart_init) //--------------------------------------------------------------------------- __fastcall Tgsd::Tgsd(AnsiString Path_AS) { ofstream Stream(Path_AS.c_str(), ofstream::trunc); if (!Stream) // Öffnen erfolgreich? { // Fehlerausgabe Application->MessageBox("Ungültiger Pfad", "Fehler", MB_ICONERROR); } Stream_glbl= Stream; // Zuweisung des Pointers an globalen Pointer } //--------------------------------------------------------------------------- __fastcall Tgsd::~Tgsd() { Stream_glbl.close(); } //--------------------------------------------------------------------------- void __fastcall Tgsd::WriteComment(AnsiString Text) { Stream_glbl << "\;" << Text.c_str(); } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //---------------------------------------------------------------------------
-
roN schrieb:
ofstream Stream_glbl; // globaler Speicher des File-Pointers
Ich seh da aber keine Pointer-Deklaration?
-junix
-
Wenn ich da ein * hintuhe, funktionierts auch nicht.
//--------------------------------------------------------------------------- #include <vcl.h> #include "tgsd.h" #include <fstream.h> ofstream *Stream_glbl; //--------------------------------------------------------------------------- #pragma package(smart_init) //--------------------------------------------------------------------------- __fastcall Tgsd::Tgsd(AnsiString Path_AS) { ofstream Stream(Path_AS.c_str(), ofstream::trunc); if (!Stream) // Öffnen erfolgreich? { // Fehlerausgabe Application->MessageBox("Ungültiger Pfad", "Fehler", MB_ICONERROR); } Stream_glbl = &Stream; } //--------------------------------------------------------------------------- __fastcall Tgsd::~Tgsd() { Stream_glbl->close(); } //--------------------------------------------------------------------------- void __fastcall Tgsd::WriteComment(AnsiString Text) { Stream_glbl << "\;" << Text.c_str(); // ^--- Hier kommt der Fehler "Unzulässige Zeigerverwendung } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //---------------------------------------------------------------------------
[edit] code hinzugefügt & (*) durch -> ersetzt [/edit]
-
Klar, denn du erzeugst ja
ofstream Stream(Path_AS.c_str(), ofstream::trunc); // hier
ein lokales objekt, auf das du
Stream_glbl = &Stream; // hier
den globalen Zeiger zeigen lässt (geiler satz (o; ).
Das problem ist nur, dass} // hier im Konstruktor
das lokale Objekt zerstört wird.
Klingelts?
-junix
-
ahja, stimmt ächz und ähm, wie kann ich das verbessern à la TIniFile? Im Konstruktor wird der Pointer erzeugt und im Destruktor gelöscht und zwischen drin gibt es Verschiedene File-zugriffsfunktionen. Danke für die Hilfe
-
Grundsätzlich solltest du darauf achten, dass das File-Objekt von einem einzelnen Objekt verwalten lässt (das auch den Schreibzugriff threadsicher machen kann). Verwenden noch andere Objekte diese File?
-junix
-
Nein, dies ist das einzige.
-
Worin liegt dann der Sinn der globalen variable?
-junix
-
Das von jeder Funktion der Klasse auf das File zugegriffen werden kann ohne das es jedesmal neu geöffnet werden muss...
-
...und wieso global und nicht als private-variable der Klasse?
-junix
-
Ich hab' das nur zum testen so schnell-schnell dort hin geschrieben.
Im moment ist die Var bereits private geworden bei mir...aber sonst, guter Hinweis!