Zugriff auf 'ios' verweigert



  • hi @ all,
    Ich hab eine Klasse geschrieben mit der es möglich sein soll eine Textdatei auszulesen und in Variablen zu speichern. Das funktioniert auch, solange ich keine Methode der KLasse benutze. mein Borland 6 meldet folgende fehler:
    [C++ Fehler] wwmU.cpp(21): E2125 Compiler konnte Konstruktor kopieren nicht für die Klasse 'ios' generieren
    [C++ Fehler] wwmU.cpp(21): E2247 Zugriff auf 'ios_base::ios_base(const ios_base &)' nicht möglich
    [C++ Fehler] wwmU.cpp(21): E2247 Zugriff auf 'ios_base::ios_base(const ios_base &)' nicht möglich
    [C++ Fehler] wwmU.cpp(21): E2247 Zugriff auf 'ios_base::ios_base(const ios_base &)' nicht möglich
    [C++ Fehler] wwmU.cpp(21): E2125 Compiler konnte Konstruktor kopieren nicht für die Klasse 'streambuf' generieren

    hier die 2 Dateien:

    // XFiles.h
    #include <fstream.h>
    #include <vcl.h>
    
    class XFiles
    {
      public:
      static const int g = 0xFF;
      fstream Datei;
      int Anz_der_geladenen_Fragen;
      char puffer[0xFF];
      static const int max_fragen_laenge = 0xFF; //Maximale Länge der Fragen
    
      AnsiString Frage[g], antw_a[g], antw_b[g], antw_c[g], antw_d[g];
      int loesung[g];
      bool gesetzt[g]; // wenn ein Array belegt ist oder schon mal verwendet wurde
    
      //XFiles::XFiles();    //Warum darf ich den Konstruktor auskommentieren???
      XFiles XFiles::LadeFragen( const char *fragen_src, XFiles obj ); /* Der Methode LadeFragen wird der komplette Pfad und
                                                                          ein XFiles Objekt übergeben. Die Fragen werden geladen
                                                                          und als XFiles Objekt zurückgegeben.
                                                                       */
      int XFiles::Anzahl_der_geladenen_Fragen();
    
    };
    // END of XFiles.h
    
    //Xfiles.cpp
    #include "XFiles.h"
             /*
    XFiles::XFiles()
    {
      int x;
    }        */
    
    int XFiles::Anzahl_der_geladenen_Fragen()
    {
      return Anzahl_der_geladenen_Fragen;
    }
    
    XFiles XFiles::LadeFragen( const char *fragen_src, XFiles obj )
    {
      try
      {
        Datei.open( *fragen_src, ios::out );
        Anz_der_geladenen_Fragen = 0;
        for( int i = 0; i < g; i++ )
        {
          if( Datei.good() )
          {
            Datei.getline(puffer, max_fragen_laenge);
            obj.Frage[i] = AnsiString(puffer);
    
            Datei.getline(puffer, max_fragen_laenge);
            obj.antw_a[i] = AnsiString(puffer);
    
            Datei.getline(puffer, max_fragen_laenge);
            obj.antw_b[i] = AnsiString(puffer);
    
            Datei.getline(puffer, max_fragen_laenge);
            obj.antw_c[i] = AnsiString(puffer);
    
            Datei.getline(puffer, max_fragen_laenge);
            obj.antw_d[i] = AnsiString(puffer);
    
            Datei.getline(puffer, max_fragen_laenge);
            obj.loesung[i] = AnsiString(puffer).ToInt();
            obj.gesetzt[i] = true;
    
            Datei.getline(puffer, max_fragen_laenge);// leerzeile wird übersprungen
            obj.Anz_der_geladenen_Fragen++;
          }
          else
            break;
        }
      }
      catch(...)
      {
        ;
      }
        return obj;
    }
    // END of XFiles.cpp
    
    // fragen.txt
    Wie lang ist die chinesische Mauer?
    2
    1Km
    2Km
    3Km
    4Km
    
    Warum ist das so?
    2
    deshalb
    darum
    nur so
    wat weis ich?
    // END of fragen.txt
    
    // die Methode hab ich so versucht an zu wenden:
    void __fastcall TForm1::LadeFragen1Click(TObject *Sender) // <--Button
    {
      XFiles FRAGEN2;
      XFiles tmp;  
      tmp.LadeFragen("c:\\fragen.txt", FRAGEN2);
    }
    

    Ich hoffe ihr könnt mir helfen

    Edit:
    Bitte die Code-Tags benutzen. Danke!

    [ Dieser Beitrag wurde am 29.04.2003 um 22:36 Uhr von Jansen editiert. ]



  • Datei.open( *fragen_src, ios::out );

    ofstream / ios::out = schreiben
    ifstream / ios::in = lesen

    kurz gesagt ios::out kann kein getline

    ausserdem würde ich nicht unbedingt
    #include <fstream.h> benutzen sondern

    #include <fstream>
    using namespace std;

    [ Dieser Beitrag wurde am 30.04.2003 um 08:20 Uhr von dreaddy editiert. ]



  • Hi,
    um mal etwas genauer darauf einzugehen:

    Denb Konstruktor kannst du Auskommentieren, da bei jeder klasse automatisch ein Standardkonstruktor ohne Parameter, oder mit eventuellen Paremter des Basisklasse- Konstruktors falls die Klasse von einer andern Abgleitet wurde.
    Somit braucht man nicht explizit einen Konstruktor erstellen.

    1. Ich würde alle Variablen als privat deklarieren.
    2. Eine fstream- instanz, welche nur in einer Funktion verwendet wird, kann man auch besser in der entsprechenden Funktion erstellen.
    3.

    int XFiles::Anzahl_der_geladenen_Fragen()
    {
      return Anzahl_der_geladenen_Fragen; //hier war wohl eher Anz_der_geladenen_Fragen gemeint
    }
    
    XFiles XFiles::LadeFragen( const char *fragen_src, XFiles obj );
    

    Eine Instance der eigenen Klasse in einer Funktion zu übergeben macht in diesen Fall kein Sinn. Der Parameter obj ist also über.
    Desweiteren ist eine Memberfunktion, die eine Instanc der selben klasse zurückgibt wohl eher ein schlechter Stil. Wenn du eine Instanz einer Klasse erzeugst, so sollte diese auch genutzt werden und eine weitere Instanz erstellt werden. Diese Vorgehensweise entspricht nicht dem Klassenkonzept und ist auch nicht im Sinne der OOP.

    5. Du erstellst in der Header Array's aof AnsiStrings und ints. Dynamische Arrays wären wohl besser geeignet, da man die Größe der Datei und damit die Anzahl der Fragen wohl kam auf 255 Zeilen beschränken möchte.

    naja, nichts für ungut. Wollte ich nur loswerden und ist nicht persöhnlich gemeind. Schließlich bin ich ja auch mal klein angefangen...



  • Ich sehe es ein das es keine gute Idee ist einem Objekt sich selbst zu übergeben um dem selben Objekt sich selbst zuzuweisen. Wahrscheinlich ist es am sinnvolsten die Methode anders zu machen.

    Danke für eure Hilfe



  • Hi,

    ja, wäre wohl besser. Sovielb brauchst du aber nicht ändern.
    Anstatt die Eigenschaften von Obj setzt du die Eigenschaften der Instanz selbst:

    Anstatt:

    Datei.getline(puffer, max_fragen_laenge);
            obj.antw_a[i] = AnsiString(puffer);
    

    So:

    Datei.getline(puffer, max_fragen_laenge);
            antw_a[i] = AnsiString(puffer);
    

    dabei benutze:

    anstatt:
    Datei.open( *fragen_src, ios::out );
    so:
    Datei.open( fragen_src);
    Schreibe die Methode so um:

    void LadeFragen( const char *fragen_src);
    

    so ungefähr zumindest...



  • ausserdem solltet du noch ein
    Datei.close();
    nach dem Punkt schreiben wo du den fstream nicht mehr benutzt, wenn die Dinger so wild rumfliegen is nich toll.



  • Hab die Problehme gelöst. Wer sehen will wie es aussieht kann es sich ja mal runterladen [OFF]

    [ Dieser Beitrag wurde am 30.04.2003 um 17:02 Uhr von LordPsycho editiert. ]


Anmelden zum Antworten