>> Operator und Bedeutung (für Operaturüberladung)



  • So ich hab ne Frage, ich möcht den Operator >> für meine Klasse nach char* überladen. Habe jetzt schon << erfolgreich überladen.

    Bedeutet >> an rechten Operator Anfügen bzw Reinschieben oder komplett neu überschreiben/schreiben. Ich will das ganze natürlich so implementieren das die Logik selbsterklärend ist.



  • wenn mich nicht alles täuscht werden primitive typen überschrieben.
    bei stream typen wird angehängt.



  • Danke, ich hab mich nun daran versucht und bin erstmal gescheidert, meine Funktion, funktioniert leider noch nicht ganz richtig

    Die Funktion hab ich als Friend in meiner Klasse definiert:

    char* operator>>(myString& other,const char* str) {
    
    	char* neu=new char[other.Len+1];
    	strcpy(neu,other.pBuf);
    	str=neu;
    	return neu;
    
    }
    

    1. er wirft beim Kompilieren keinen Fehler aus
    2. innerhalb der Funktion funktioniert es durchaus noch
    3. mystr>>charstr; liefert mir nur einen Buchstaben Salat in charstr

    Das ganze als Unäre Methode in der Klasse funktioniert aber auch nicht, mit den selben Problemen wie oben beschrieben:

    char* myString::operator>>(char* str) {
    
    	char* neu=new char[Len+1];
    	strcpy(neu,pBuf);
    	str=neu;
    	return neu;
    
    }
    

    Was mache ich falsch?

    Edit: Also ich glaube charstr wird gar nicht angetastet, aber die Operator Funktion wird definitiv ausgeführt



  • Fehler gefunden so funktionierts:

    Methode meiner Klasse:

    void myString::operator>>(char** str) {
    
    	*str=new char[Len];
    	strcpy(*str,pBuf);
    
    }
    
    mystr>>&strchar;
    


  • der stream operator ist für ströme da.

    warum willst du ihn hier einsetzen?



  • Shade Of Mine schrieb:

    der stream operator ist für ströme da.

    warum willst du ihn hier einsetzen?

    op>> ist allerdings nur dann ein streamoperator wenn man ihn für ströme deklariert... Man denke nur an die (eingebauten) Bitshifts für Integertypen, das ist der selbe Operator, im Grunde sogar das "Original". Boost::Spirit benutzt ihn für die Konkatenation seiner EBNF-Ausdrücke, in einem anderen Kontext kann man ihn auch noch ganz anders benutzen.
    Wichtig ist dabei nur, dass die Verwendung gut dokumentiert wird und halbwegs intuitiv ist, was ja eigentlich für alle Operatoren gilt.

    Allerdings gehört der op>> von rübe wohl eher nicht in die Kategorie - die Verwendung ist nicht intuitiv und die Implementierung mit C-Funktion (und nebenbei einem char zu wenig, Stichwort '\0') bestenfalls fragwürdig und unschön.



  • Gut das mit dem 1 Zeichen ist mir jetzt auch sofort aufgefallen. Nur verstehe ich nicht warum das nicht in Ordnung geht, andere mir bekannte Stringklassen nutzen das den Operator auch (vielleicht überseh ich auch ein Detail). (Gut im Prinzip seh ich mich ja auch eher noch als Anfänger)

    Warum sind die C-Funktionen nicht optimal? Wie sollte ich es deiner Meinung den sonst machen (Jedes Zeichen einzeln mit char* kopieren wär doch auch unnötig),. Noch eine weitere Stringklasse z.B.: will ich nicht einführen (mich nervt schon die der GUI meine Eigene und der einfache char* String). Ich bin nicht selbst auf die Idee gekommen eine eigene Stringklasse zu bauen, muss es nun aber machen, also wollte ich mir durch geschickte Methoden die ewige hin- und her Konvertiererei erleichtern. (Das betrifft jetzt nicht nur den char* String). Für Ratschläge bin ich jederzeit offen. Jedenfalls hab ich über die Operatoren erstmal einfach Konkatenationen(oder wie nennt man das?) realisiert, ich könnte auch auf den + Operator ausweichen. Das mit Funktionen zu machen gefällt mir auch irgendwie nicht so richtig.

    Aber, danke ich bin erstmal wieder schlauer . 🕶



  • die_rübe schrieb:

    Jedenfalls hab ich über die Operatoren erstmal einfach Konkatenationen(oder wie nennt man das?) realisiert

    Nö hast du nicht. Dein operator>> legt eine Kopie des Stringinhalts in einem char-Array ab, der Pointer den du als rechtes Argument des Operators übergibst, zeigt danach auf dieses neu generierte Char-Array. Ich würd gern mal sehen welche String-Klasse so ihre C-string Konvertierung oder ihren Konkatenationsoperator implementiert. (Konkatenation = Aneianderkettung)

    Schau dir dahingehend mal std::string an. Auch wenn dessen Interface hoffnungslos überladen ist, sind der Ctor der einen char* nimmt und die c_str()-Methode aus guten Gründen so implementiert wie sie sind.



  • Die Anneinanderkettung funktioniert bei mir ja auch in die andere Richtung über <<. Für das was ich oben mache nutze ich jetzt den = Operator(natürlich als binärer friend Operator also char*=myString) hoffe so ist es logischer. Danke.


Anmelden zum Antworten