CString-Problem



  • hi, warum kann ich CStrings nicht per Referenz zurückgeben????? Die Ausgabe mit cout(LPCSTR) liefert immer nur kryptische Zeichen... lasse ich die Referenz weg geht alles ohne Probleme.

    z.b
    const CString & xxx::test()const
    {
    CString str = "Hallo";
    return str;
    }

    MfG dohan



  • Wenn CString als Referenz zurückgegeben werden soll, dann sollte das Ganze so aussehen:

    const CString& xxx::test()const
    {
     static CString str("");
     str = "Hallo";
     return str;
    }
    


  • danke für die antwort ... warum muss man den die variable static deklarieren??? gibt es dafür nen bestimmten grund???

    mfg dohan



  • mit static bleibt die variable erhalten.

    du initialisiert sie in der methode mit:

    static int i = 0;
    

    und dann weist du ihr einen wert zu. beim nächsten aufruf der methode hat sie den wert dann halt noch.

    ne normale variable in der methode wir an deren ende ja wieder zerstört. eine static wird erst beim programmende zerstört.



  • wie kann ich denn den inhalt der variable bei jedem methodenaufruf ändern ohne zeiger zu verwenden???



  • Du kannst CString auch ohne Referenz zurückgeben da der Compiler das optimiert.
    Er optimiert aber nur wenn du bei jedem return in der Funktion das gleiche Objekt zurückgibst.

    wenn du schreibst:

    CString xxx()
    {
      CString text;
      text = (...);
      return text;
    }
    

    dann macht er im Prinzip daraus:

    void xxx(CString& text)
    {
      text = (...);
    }
    


  • Das obige Optimierkonzept is ein wenig hausbacken 🙂

    Meines erachtens optimiert nicht der Compiler, sondern CString hat einen Copy-Konstruktor, der nicht jedes Zeichen im String kopiert, sondern diese nur 1 Mal im Speicher hält und dann nur Zeiger auf die Zeichenkette kopiert. Mittels einem Referenzzählers bekommt er dann beim Ende der Funktion mit, dass noch jmd. auf den String guggt und löscht die Zeichen nicht aus dem Speicher, sondern erst wenn keine Variable mehr auf den String verweist.

    Ergo.. wie schon von Vorrednern festgestellt... CString zurückgeben ist nahezu genauso schnell wie es bei const CString& wäre.

    / Mibo


Anmelden zum Antworten