Inhalt von newText wird nicht auf Text übertragen



  • Hallo freundliche Community,

    Gibt es eine Möglichkeit, folgenden Quelltext zu realisieren?

    class Klasse {
    public:
     Klasse() {
     };
    
     ~Klasse() {
     };
    
     void SetText(char *newText) {
      Text = newText;
     }
    
    protected:
     char *Text;
    };
    
    void Klasse::SetText(char *newText) {
     Text = newText;
    }
    
    SetText("Hallo");
    

    Natürlich wird der Inhalt von newText nicht auf Text übertragen. Aber warum?



  • Entschuldigung, dass ich für Klasse::SetText 2x einen Funktionsrumpf geschrieben habe.



  • Nee, nicht mit C-Strings. Wenn du schon Klassen und damit C++ verwendest, warum nimmst du nicht den std::string?

    void Klasse::SetText(const std::string& newText) {
       Text = newText;
      }
    ..
    private:
      std::string Text;
    

    Wenn du die C-Interfaces der WinaApi bedienen möchtest, schau dir einmal die Memberfunktion c_str() von std::string an.

    Ach ja: Fall du aus welchem Grund auch immer dennoch C-Strings verwenden möchtest, musst du die Speicherverwaltung selber übernehmen und Funktionen wie strpy und strlen verwenden oder Adäquates selber schreiben.

    const char* p = "Hello";
    const char* cpy = p; // copy zeigt auf p, es wird keine Kopie des Inhalts angelegt!
    char* p1 = new char[strlen(p)+1]; // +Nullterminierung
    strcpy(p1, p);
    ..
    delete [] p;
    

    Das letzte ungetestete Beispiel soll einfach verdeutlichen, warum man diese Funktionalitäten auslagern und nicht jedesmal das Rad neu erfinden sollte. Außerdem wird bei Verwendung der Stl-Container (und beinahe-Container wie std::string) der Speicher immer zuverlässig freigegeben.



  • Konstante Referenz als Übergabeparameter macht mehr Sinn, wenn es sich um große Datenmengen handelt, damit nicht zusätzlich Speicher für eine Kopie belegt wird. Für ein String-Objekt in einer kleineren Anwendung reicht auch eine Kopie aus.
    Die Frage ist im falschen Forum gestellt worden, es sei denn der Beitragsautor möchte sein WinAPI objektorientiert implementieren, aber da sind wir auch schon beim MFC... Wenn der nette Fragesteller C++ verwenden möchte, würde ich empfehlen, auf den C-Code ganz zu verzichten.
    Noch etwas: werden der Default-Konstruktor und -Destruktor nicht implizit vom Compiler automatisch aufgerufen, falls es keine anderen gibt?



  • [Rewind] schrieb:

    Konstante Referenz als Übergabeparameter macht mehr Sinn, wenn es sich um große Datenmengen handelt, damit nicht zusätzlich Speicher für eine Kopie belegt wird.

    Klar, bei Objekten wie einem string ist das so, bei einem Zeiger auf ein Array wird aber eben keine Kopie des Inhalts angelegt, egal ob konstant oder nicht.
    Generell stimmt das aber, eine Funktion void SetText(char* text); würde ich nur ungern aufrufen wollen, bei Zeigern auf nichtkonstanten Inhalt muss man davon ausgehen, dass die Funktion die Daten auch ändert (was im Falle von einer Funktion namens SetText aber bemerkenswert wäre).
    Const-Correctness ist imho bei etwas größeren Projekten unabdingbar.


Anmelden zum Antworten