Automatisches Casten eigener Klasse ermöglichen



  • Hallo allerseits,
    mir stellt sich gerade folgende Frage. Angenommen, ich habe mir eine eigene Stringklasse geschrieben und möchte, dass diese nun auch in ein char* konvertiert werden kann. Das ganze soll dann ungefähr so ablaufen:

    char *x = myString;

    bzw.

    char x = (char*) myString;

    Wie ermögliche ich sowas?



  • Hi,

    dafür gibt's den Konvertierungsoperator, den jede Klasse definieren kann. Dann braucht's nichtmal den expliziten cast.

    struct myString {
       operator char*();
    };
    

    (geht natürlich auch für andere Typen als char*)

    Aber Vorsicht: Nicht selten bringt der Konvertierungsoperator mehr Probleme als er löst - er wird nämlich sehr viel häufiger angewendet, als man so meint.
    Ich habe mal gelesen (weiß nicht mehr wo), dass das einzige, was beim Design von std::string richtig gemacht worden sei, darin bestünde, dass man den char*-konvertierungsoperator weggelassen habe...

    Vergiss bei Deinem Ziel nicht Folgendes:

    myString s;
    char* c;
    c = s; // impliziter Call des Konv-op.
    strcpy(c, "Dies ist ein gaaaaaaanz langer Text und niemand weiß, ob der Buffer in s das alles aufnehmen kann und ob das Objekt noch \"in sich konsistent\" ist ... z.B. ob eine intern verwaltete Länge noch stimmt ....");
    
    delete[] c; // Huuuups, nun hat s vielleicht keinen Speicher mehr und weiß es nichtmal
    
    char st[100];
    
    strcpy(s, "TestString"); // Hupps, eigentlich meinte der Programmierer die Variable st
    // ohne Konv-Op würde dieser Fehler beim Compile auffallen; so schreibt er in s.p rum und keiner weiß es...
    

    Schau Dir lieber std::sting::c_str() an ...

    Gruß,

    Simon2.



  • Danke, die Frage war nur am Beispiel von einem String erklärt, sozusagen war es eine abstrakte Frage :). Wozu selbst Strings definieren, wenn man std::string hat :).

    Trotzdem, super Antwort, hat alles erklärt, was man dazu wissen muss. 👍



  • Freut mich, wenn ich helfen konnte. 😋 🙂

    Danke für die Rückmeldung,

    Simon2.


Anmelden zum Antworten