Filestream als return Wert



  • Wieso meinst du, sollte man hier Autozeiger verwenden? Reicht die Rückgabe als Referenz nicht aus?



  • Nexus schrieb:

    Wieso meinst du, sollte man hier Autozeiger verwenden? Reicht die Rückgabe als Referenz nicht aus?

    Mit den gegebenen Informationen kommt der ifstream als Referenz aus einer globalen Funktion heraus. Das heisst, ifstream ist vermutlich eine auto-Variable aus der Funktion und somit wird da Schrott zurückgegeben (weil ifstream beim Verlassen der Funktion wieder zerstört wird).



  • Tachyon schrieb:

    Mit den gegebenen Informationen kommt der ifstream als Referenz aus einer globalen Funktion heraus. Das heisst, ifstream ist vermutlich eine auto-Variable aus der Funktion und somit wird da Schrott zurückgegeben (weil ifstream beim Verlassen der Funktion wieder zerstört wird).

    Aber wenn der Threadersteller von "Methode" spricht, denke ich, der Filestream könnte auch eine Klassenvariable sein (ist zwar nicht sehr sinnvoll, aber ja...). Was würde die Rückgabe eines lokalen Filestreams bringen (auch designtechnisch)?

    Warten wir doch einfach, bis wir genauere Absichten erfahren 😉



  • Nexus schrieb:

    Was würde die Rückgabe eines lokalen Filestreams bringen (auch designtechnisch)?

    Nichts, aber es funktioniert ja offensichtlich auch nicht. 😉



  • Der Hintergrund warum ich hier mit filestreams arbeite ist dass ich eine verschlüsselte Datei hab die dann entschlüsselt in ein filestreamobject gekapselt wird um dann intern damit weiterarbeiten zu können !
    (die entschlüsselte Datei soll nicht im Klartext auf der Platte abgelegt werden)

    mfg

    PS: Der Compiler meckert bezüglich des return Typs



  • Es wäre sehr schön, wenn du endlich ein bisschen mehr relevanten Code (Klasse, Funktion, Filestream) und die Fehlermeldung des Compilers hier angeben könntest, dann müssten wir auch nicht raten.



  • header file

    #define C_FN_SHARE extern "C" __declspec(dllexport)
    ..
    C_FN_SHARE ifstream& KcEncryptStream(LPCTSTR lpInFile, LPCTSTR lpPassword);
    

    cpp file

    C_FN_SHARE ifstream& KcEncryptStream(LPCTSTR lpInFile, LPCTSTR lpPassword)
    {
      ...
      ifstream hOutStream;
      ...
      return hOutStream;
    }
    

    (geht ohne Referenz aber auch nicht)

    Compiler Fehler Meldung

    error C2143: syntax error : missing ';' before '&'
    error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    error C2065: 'hOutStream' : undeclared identifier
    

    #include <fstream> ist inkludiert

    Danke und mfg



  • Ich habe die starke Vermutung, dass ein std:: fehlt.

    BTW: Beißen sich extern "C" und die Verwendung von Klassen nicht ein wenig? Ich meine, wenn der Aufrufer ein C-Programm ist, wird er die zurückgegebene Klasse doch sicher sowieso nicht benutzen können?



  • Mach es doch durch Überladung des >> Operators. Dann kannst Du es auf die übliche Art und Weise benutzen.

    class Decrypter
    {
    public:
        Decrypter(const SpecialParamType& param);
        void decrypt(TypeOfDataToDecrypt& data);
        //...interna
    };
    
    std::istream& operator>>(std::istream& str, Decrypter& enc)
    {
        //enc benutzen um den stream zu manipulieren...
        return str;
    }
    
    int main()
    {
        //verschluesselte datei oeffnen
        std::ifstream stream("decrypted_data.dat");
    
        //dycrypter
        Decrypter decrypter(4711);
    
        //einlesen
        stream >> decrypter;
    }
    


  • Danke !

    Hatte blöderweise das std:: vergessen da ich normalerweise eh immer ein

    using std;
    

    hab, aber diesmal eben nicht !

    Danke und lg



  • Du kannst sowiso nicht c++ konstrukte (hier templates, klassen) als extern "C" exportieren.

    Simon



  • simon.gysi schrieb:

    Du kannst sowiso nicht c++ konstrukte (hier templates, klassen) als extern "C" exportieren.

    Simon

    Er exportiert doch nur eine Funktion, wieso sollte das nicht gehen? Bloss weil der Return-Typ ne C++ Klasse ist? Sollte doch egal sein...
    (Kann man aus C heraus dann natürlich nicht verwenden, aber wenns nur dazu da ist um definierte Namen zu erhalten...)

    Davon abgesehen dass es IMO gehen sollte wäre es vermutlich trotzdem besser die exportierten Funktionen entweder ganz ohne extern "C" zu exportieren, oder aber in ein Interface zu packen, und nur einen Zeiger auf dieses Interface von einer einzigen extern "C" Funktion zurückgeben zu lassen.

    Der MSVC geht nämlich per default z.B. auch davon aus dass extern "C" Funktionen keine Exceptions werfen... und dann passiert grober Mist wenn eine extern "C" Funktion nun doch eine Exception wirft.


Anmelden zum Antworten