Problem mit CString...



  • Hi!

    Wieso funktioniert der folgende Code nicht? (Der FileDialog hat als Überschrift immer ganz viele ÝÝÝÝ...)

    CString Funktion()
    {
        return "Überschrift";
    }
    
    CFileDialog fdDialog(TRUE);
    
    fdDialog.m_ofn.lpstrTitle = Funktion();
    

    Was habe ich falsch gemacht?



  • Bloops schrieb:

    fdDialog.m_ofn.lpstrTitle = Funktion();
    

    Du kannst in lpstrTitle keine Kopie des CString speichern, den Funktion zurückgibt, sondern nur einen Zeiger, der über einen Konvertierungsoperator der Klasse CString herausgegeben wird. Der CString selbst wird direkt nach dieser Zeile wieder zerstört, und der Zeiger, den du in lpstrTitle abgelegt hast, wird damit ungültig.

    Verhindern kannst du das, indem du den Rückgabewert von Funktion mit einer anderen CString-Instanz "am Leben erhältst":

    CFileDialog fdDialog(TRUE);
    CString strTitle = Funktion();
    fdDialog.m_ofn.lpstrTitle = strTitle;
    


  • Hm... Das klingt logisch. So wie du das gemacht hast, hatte ich das auch schon vorher, aber ich suche ja eine Möglichkeit, durch die ich mir das Deklarieren einer zusätzlichen CString-Variable sparen kann. Aber anscheinend geht das nicht... oder doch?

    Bloops



  • Hallo zusammen,

    ich habe es jetzt nicht getestet. Aber rein von der Logik her dürfte es bei der Lösung von MFK auch nur zufällig gehen, da der CString am Ende der Funktion wieder gekillt wird. Den musst du im Header deiner Klasse deklarieren oder irgendwo, wo er dir nicht zerschossen wird.

    Oder steh ich grad am Schlauch??

    Grüße, Volle.



  • Bloops schrieb:

    Hm... Das klingt logisch. So wie du das gemacht hast, hatte ich das auch schon vorher, aber ich suche ja eine Möglichkeit, durch die ich mir das Deklarieren einer zusätzlichen CString-Variable sparen kann. Aber anscheinend geht das nicht... oder doch?

    Wenn Funktion nicht zwingend ein CString zurückgeben muss, und du an dieser Stelle immer nur Stringliterale verwenden wirst, kannst du Funktion LPCTSTR zurückgeben lassen, dann brauchst du keine CString-Instanz. Aber ich würde mir wegen der einen Instanz nicht so große Gedanken machen. AFAIK hat CString lazy-copy.

    Volle schrieb:

    ich habe es jetzt nicht getestet. Aber rein von der Logik her dürfte es bei der Lösung von MFK auch nur zufällig gehen, da der CString am Ende der Funktion wieder gekillt wird.

    Solange der CString nur für den Titel des OpenFile-Dialogs gebraucht wird, ist das kein Problem, denn die Instanz der Dialogklasse ist auch eine Autovariable und liegt im selben Scope.



  • Ja logo. Hast recht...

    Ich dachte, er möchte innerhalb einer DLG- Klasse den Namen ändern...

    Gruß, Volle.


Anmelden zum Antworten