std::ifstream als Basisklasse



  • Hallo!

    Ich wollte mir eine von std::ifstream abgeleitete Klasse schreiben, die mir das parsen von Dateien erleichtern soll. Aber ich krieg nen Compiler Fehler, wenn ich im Elementinitialisierer den Konstruktor von std::ifstream aufrufe.

    class test : public std::ifstream
    {
    public:
    	test(char* filename);
    };
    
    test::test(char* filename) : std::ifstream(filename) // error C2614: 'test' : illegal member initialization: 'ifstream' is not a base or member
    {
    }
    

    Am Namespace std scheint es nicht zu liegen... Weiss jemand woher das Problem kommt und was man dagegen tun kann?
    MfG



  • Ähm, mir ist grad' aufgefallen, dass es ja (zumindest in meinem Fall) nicht sonderlich viel Sinn macht, von std::ifstream zu erben. Bis auf den Destruktor ist da ja keine Funktion als virtual deklariert.
    Naja, dann werd' ich das wohl ohne Vererbung lösen und einfach ne Klasse schreiben, die einen std::ifstream member hat.

    Eine Antwort auf meine Frage hätte ich aber trotzdem gerne. Was habe ich an dem Code falsch geschrieben, dass der mir diese Fehlermeldung ausgibt?



  • #include <fstream>
    class test : public std::ifstream
    {
    public:
    test(char* filename);
    };

    test::test(char* filename) : std::ifstream(filename) // error C2614: 'test' : illegal member initialization: 'ifstream' is not a base or member
    {
    }

    int main(){
    test foo("test.cpp");
    }

    klappt problemlos mit dem mingw

    deine helferklasse kannst du aber immernoch gut über die in ifstream enthaltenen locales realisieren, denn imho ist da die ganze funktionalität drin(und was nicht über die locales geht, schafft der buffer)



  • otze schrieb:

    klappt problemlos mit dem mingw

    Hmm, ich sollte dringend meinen MSVC6 wegschmeissen. Gab es nicht irgendwo ne Anleitung, wie man das VCToolkit 2003 mit dem MSVC6 benutzt?

    deine helferklasse kannst du aber immernoch gut über die in ifstream enthaltenen locales realisieren, denn imho ist da die ganze funktionalität drin(und was nicht über die locales geht, schafft der buffer)

    Sorry, aber das versteh' ich leider mal gar nicht... Könntest du vielleicht ein kleines Beispiel geben oder das mal genauer erklären?



  • Ich wollte mir eine von std::ifstream abgeleitete Klasse schreiben, die mir das parsen von Dateien erleichtern soll

    Normalerweise leitet man nicht von einem Stream sondern von streambuf ab und installiert den neuen Streambuf dann in einem Stream.
    Siehe dazu z.B. http://www.langer.camelot.de/IOStreams/Excerpt/excerpt.htm

    godlikebot schrieb:

    otze schrieb:

    klappt problemlos mit dem mingw

    Hmm, ich sollte dringend meinen MSVC6 wegschmeissen.

    Das VC 6-Problem kannst du so umgehen:

    class test : public std::ifstream
    {
    public:
        typedef std::ifstream Base;
    	test(char* filename);
    };
    
    test::test(char* filename) : Base(filename) 
    {
    }
    


  • HumeSikkins schrieb:

    Ich wollte mir eine von std::ifstream abgeleitete Klasse schreiben, die mir das parsen von Dateien erleichtern soll

    Normalerweise leitet man nicht von einem Stream sondern von streambuf ab und installiert den neuen Streambuf dann in einem Stream.
    Siehe dazu z.B. http://www.langer.camelot.de/IOStreams/Excerpt/excerpt.htm

    Danke für den Link! Hab ihn zwar noch nicht ganz durch, aber für mein kleines Problemchen ist es wahrscheinlich viel zu aufwendig nen eigenen streambuf zu schreiben... Mit ner Klasse mit std::ifstream member ist es (so, wie ich das jetzt beurteilen kann) deutlich einfacher. Nichtsdestotrotz werd' ich mir das noch durchlesen, der link ist wirklich interessant 👍.


Anmelden zum Antworten