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!


Anmelden zum Antworten