<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Finde Fehler in String Klasse nicht]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich will eine String Klasse schreiben, um zu verstehen wie div. Dinge intern funktionieren. Außerdem soll es möglich sein den String entsprechenden integer, float, etc. zuweisbar sein (also umwandelbar).</p>
<p>Jedoch habe ich irgendwo in meinem Ansatz einen Fehler, da nachdem ich den String über die entsprechenden Funktionen in den entsprechenden Datentyp umzuwandeln wie z.B. int, float, etc. sind meine char* Daten totaler Matsch... Selbst wenn ich das Konstant zurück gebe anstatt es durch die Funktionen umwandeln zu lassen werden meine Daten matsch... Ich suche schon seit mehreren Stunden und finde den Fehler nicht.... Kann es sein das ich irgendeinen essentiellen Fehler bei der Überladung gemacht habe? Ich hoffe jmd. findet den Fehler, denn ich selbst hab all mein Wissen daran probiert und nichts gefunden...</p>
<p>Header</p>
<pre><code class="language-cpp">#ifndef STRING_H_INCLUDED
#define STRING_H_INCLUDED

#include &lt;iostream&gt;
#include &lt;exception&gt;

class String;
class StringHelper;

class OutOfRangeException : public std::exception{
    virtual const char* what() const throw()
    {
        return &quot;String kann nicht umgewandelt werden, da ausserhalb des Wertebereichs.&quot;;
    }
};

class StringHelper{
    public:
        static int      toInt(String);
        static float    toFloat(String);
        static double   toDouble(String);
};

/**
    STRING LIBARY
*/
class String{
    public:
        String(){
            this-&gt;data = NULL;
        };
        ~String(){
            if(this-&gt;data != NULL)
                delete this-&gt;data;
        };

        /**
            Wrapper Funktionen für type-casting
        */
        char*   toChar()    { return this-&gt;data; };
        int     toInt()     { return StringHelper::toInt(*this); };
        float   toFloat()   { return StringHelper::toFloat(*this); };
        double  toDouble()  { return StringHelper::toDouble(*this); };

        /**
            INT &quot;cast&quot; via &lt;&lt; oder &gt;&gt; operatoren
        */
        friend int&amp; operator &lt;&lt; (int&amp;, String);
        friend int&amp; operator &gt;&gt; (String, int&amp;);

        friend String&amp; operator &lt;&lt; (String&amp;, int);
        friend String&amp; operator &gt;&gt; (int, String&amp;);

        /**
            FLOAT &quot;cast&quot;
        */
        friend float&amp; operator &lt;&lt; (float&amp;, String);
        friend float&amp; operator &gt;&gt; (String, float&amp;);

        friend String&amp; operator &lt;&lt; (String&amp;, float);
        friend String&amp; operator &gt;&gt; (float, String&amp;);

        /**
            Output-STREAM Operatoren
        */
        friend std::ostream&amp; operator &lt;&lt; (std::ostream&amp;, String);
        friend std::ostream&amp; operator &lt;&lt; (std::ostream&amp;, String*);

        String&amp; operator = (char*);
        String&amp; operator = (int);
        String&amp; operator = (float);
        String&amp; operator = (double);
        String&amp; operator = (const char*);

        /**
            CAST Operators
        */
        operator int(){ return this-&gt;toInt(); }
        operator double(){ return this-&gt;toDouble(); }
        operator float(){ return this-&gt;toFloat(); }

    private:
        char *data;
};

#endif // STRING_H_INCLUDED
</code></pre>
<p>Quelltext</p>
<pre><code class="language-cpp">#include &quot;string.h&quot;

int      StringHelper::toInt(String s){
    int tmp = strtol(s.toChar(), NULL, 10);

    if ((errno == ERANGE &amp;&amp; (tmp == LONG_MAX || tmp == LONG_MIN))
            || (errno != 0 &amp;&amp; tmp == 0)) {
        throw OutOfRangeException();
    }

    return tmp;
}
float    StringHelper::toFloat(String s){
    float tmp = strtod(s.toChar(), NULL);

    if ((errno == ERANGE)
            || (errno != 0 &amp;&amp; tmp == 0)) {
        throw OutOfRangeException();
    }

    return tmp;
}
double   StringHelper::toDouble(String s){
    double tmp = strtod(s.toChar(), NULL);

    if ((errno == ERANGE)
            || (errno != 0 &amp;&amp; tmp == 0)) {
        throw OutOfRangeException();
    }

    return tmp;
}

/**
    INT &quot;cast&quot; via &lt;&lt; oder &gt;&gt; operatoren
*/
int&amp; operator &lt;&lt; (int&amp; i,String s){
    i = s.toInt();
    return i;
}

int&amp; operator &gt;&gt; (String s, int&amp; i){
    i = s.toInt();
    return i;
}

String&amp; operator &lt;&lt; (String&amp; s, int i){
    char* buf = new char[128];
    sprintf(buf, &quot;%i&quot;, i);
    s.data = buf;
    return s;
}

String&amp; operator &gt;&gt; (int i, String&amp; s){
    char* buf = new char[128];
    sprintf(buf, &quot;%i&quot;, i);
    s.data = buf;
    return s;
}

/**
    FLOAT &quot;cast&quot;
*/
float&amp; operator &lt;&lt; (float&amp; i,String s){
    i = s.toFloat();
    return i;
}

float&amp; operator &gt;&gt; (String s, float&amp; i){
    i = s.toFloat();
    return i;
}

String&amp; operator &lt;&lt; (String&amp; s, float i){
    char* buf = new char[128];
    sprintf(buf, &quot;%f&quot;, i);
    s.data = buf;
    return s;

}
String&amp; operator &gt;&gt; (float i, String&amp; s){
    char* buf = new char[128];
    sprintf(buf, &quot;%f&quot;, i);
    s.data = buf;
    return s;
}

std::ostream&amp; operator &lt;&lt; (std::ostream&amp; stream, String s)
{
    stream &lt;&lt; s.toChar();
    return stream;
};
std::ostream&amp; operator &lt;&lt; (std::ostream&amp; stream, String *s)
{
    stream &lt;&lt; s-&gt;toChar();
    return stream;
};

String&amp; String::operator = (char* ca){
    this-&gt;data = ca;
    return *this;
}

String&amp; String::operator = (int i){
    char* buf = new char[128];
    sprintf(buf, &quot;%i&quot;, i);
    this-&gt;data = buf;
    return *this;
}

String&amp; String::operator = (float i){
    char* buf = new char[128];
    sprintf(buf, &quot;%f&quot;, i);
    this-&gt;data = buf;
    return *this;
}

String&amp; String::operator = (double i){
    char* buf = new char[128];
    sprintf(buf, &quot;%f&quot;, i);
    this-&gt;data = buf;
    return *this;
}

String&amp; String::operator = (const char* ca){
    // Einfach formuliert ca den const charakter nehmen
    *this = const_cast&lt;char*&gt;(ca);
    return *this;
}
</code></pre>
<p>Test</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;main.h&quot;

using namespace std;

int main()
{
    try{
        String s;
        s = &quot;3&quot;;

        int i = 300;
        float f = 5.56;

        s &lt;&lt; f;
        i &lt;&lt; s; // Hier tritt der Fehler auf...

        cout &lt;&lt; i &lt;&lt; endl;
        cout &lt;&lt; f &lt;&lt; endl;
        cout &lt;&lt; s &lt;&lt; endl;

    }catch(...){
        cout &lt;&lt; &quot;Uncatched Exception occured.&quot; &lt;&lt; endl;
        return -1;
    }

    return 0;
}
</code></pre>
<p>Danke.<br />
Blackskyliner</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/261337/finde-fehler-in-string-klasse-nicht</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 08:23:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/261337.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 17 Feb 2010 07:14:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Finde Fehler in String Klasse nicht on Wed, 17 Feb 2010 07:14:20 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich will eine String Klasse schreiben, um zu verstehen wie div. Dinge intern funktionieren. Außerdem soll es möglich sein den String entsprechenden integer, float, etc. zuweisbar sein (also umwandelbar).</p>
<p>Jedoch habe ich irgendwo in meinem Ansatz einen Fehler, da nachdem ich den String über die entsprechenden Funktionen in den entsprechenden Datentyp umzuwandeln wie z.B. int, float, etc. sind meine char* Daten totaler Matsch... Selbst wenn ich das Konstant zurück gebe anstatt es durch die Funktionen umwandeln zu lassen werden meine Daten matsch... Ich suche schon seit mehreren Stunden und finde den Fehler nicht.... Kann es sein das ich irgendeinen essentiellen Fehler bei der Überladung gemacht habe? Ich hoffe jmd. findet den Fehler, denn ich selbst hab all mein Wissen daran probiert und nichts gefunden...</p>
<p>Header</p>
<pre><code class="language-cpp">#ifndef STRING_H_INCLUDED
#define STRING_H_INCLUDED

#include &lt;iostream&gt;
#include &lt;exception&gt;

class String;
class StringHelper;

class OutOfRangeException : public std::exception{
    virtual const char* what() const throw()
    {
        return &quot;String kann nicht umgewandelt werden, da ausserhalb des Wertebereichs.&quot;;
    }
};

class StringHelper{
    public:
        static int      toInt(String);
        static float    toFloat(String);
        static double   toDouble(String);
};

/**
    STRING LIBARY
*/
class String{
    public:
        String(){
            this-&gt;data = NULL;
        };
        ~String(){
            if(this-&gt;data != NULL)
                delete this-&gt;data;
        };

        /**
            Wrapper Funktionen für type-casting
        */
        char*   toChar()    { return this-&gt;data; };
        int     toInt()     { return StringHelper::toInt(*this); };
        float   toFloat()   { return StringHelper::toFloat(*this); };
        double  toDouble()  { return StringHelper::toDouble(*this); };

        /**
            INT &quot;cast&quot; via &lt;&lt; oder &gt;&gt; operatoren
        */
        friend int&amp; operator &lt;&lt; (int&amp;, String);
        friend int&amp; operator &gt;&gt; (String, int&amp;);

        friend String&amp; operator &lt;&lt; (String&amp;, int);
        friend String&amp; operator &gt;&gt; (int, String&amp;);

        /**
            FLOAT &quot;cast&quot;
        */
        friend float&amp; operator &lt;&lt; (float&amp;, String);
        friend float&amp; operator &gt;&gt; (String, float&amp;);

        friend String&amp; operator &lt;&lt; (String&amp;, float);
        friend String&amp; operator &gt;&gt; (float, String&amp;);

        /**
            Output-STREAM Operatoren
        */
        friend std::ostream&amp; operator &lt;&lt; (std::ostream&amp;, String);
        friend std::ostream&amp; operator &lt;&lt; (std::ostream&amp;, String*);

        String&amp; operator = (char*);
        String&amp; operator = (int);
        String&amp; operator = (float);
        String&amp; operator = (double);
        String&amp; operator = (const char*);

        /**
            CAST Operators
        */
        operator int(){ return this-&gt;toInt(); }
        operator double(){ return this-&gt;toDouble(); }
        operator float(){ return this-&gt;toFloat(); }

    private:
        char *data;
};

#endif // STRING_H_INCLUDED
</code></pre>
<p>Quelltext</p>
<pre><code class="language-cpp">#include &quot;string.h&quot;

int      StringHelper::toInt(String s){
    int tmp = strtol(s.toChar(), NULL, 10);

    if ((errno == ERANGE &amp;&amp; (tmp == LONG_MAX || tmp == LONG_MIN))
            || (errno != 0 &amp;&amp; tmp == 0)) {
        throw OutOfRangeException();
    }

    return tmp;
}
float    StringHelper::toFloat(String s){
    float tmp = strtod(s.toChar(), NULL);

    if ((errno == ERANGE)
            || (errno != 0 &amp;&amp; tmp == 0)) {
        throw OutOfRangeException();
    }

    return tmp;
}
double   StringHelper::toDouble(String s){
    double tmp = strtod(s.toChar(), NULL);

    if ((errno == ERANGE)
            || (errno != 0 &amp;&amp; tmp == 0)) {
        throw OutOfRangeException();
    }

    return tmp;
}

/**
    INT &quot;cast&quot; via &lt;&lt; oder &gt;&gt; operatoren
*/
int&amp; operator &lt;&lt; (int&amp; i,String s){
    i = s.toInt();
    return i;
}

int&amp; operator &gt;&gt; (String s, int&amp; i){
    i = s.toInt();
    return i;
}

String&amp; operator &lt;&lt; (String&amp; s, int i){
    char* buf = new char[128];
    sprintf(buf, &quot;%i&quot;, i);
    s.data = buf;
    return s;
}

String&amp; operator &gt;&gt; (int i, String&amp; s){
    char* buf = new char[128];
    sprintf(buf, &quot;%i&quot;, i);
    s.data = buf;
    return s;
}

/**
    FLOAT &quot;cast&quot;
*/
float&amp; operator &lt;&lt; (float&amp; i,String s){
    i = s.toFloat();
    return i;
}

float&amp; operator &gt;&gt; (String s, float&amp; i){
    i = s.toFloat();
    return i;
}

String&amp; operator &lt;&lt; (String&amp; s, float i){
    char* buf = new char[128];
    sprintf(buf, &quot;%f&quot;, i);
    s.data = buf;
    return s;

}
String&amp; operator &gt;&gt; (float i, String&amp; s){
    char* buf = new char[128];
    sprintf(buf, &quot;%f&quot;, i);
    s.data = buf;
    return s;
}

std::ostream&amp; operator &lt;&lt; (std::ostream&amp; stream, String s)
{
    stream &lt;&lt; s.toChar();
    return stream;
};
std::ostream&amp; operator &lt;&lt; (std::ostream&amp; stream, String *s)
{
    stream &lt;&lt; s-&gt;toChar();
    return stream;
};

String&amp; String::operator = (char* ca){
    this-&gt;data = ca;
    return *this;
}

String&amp; String::operator = (int i){
    char* buf = new char[128];
    sprintf(buf, &quot;%i&quot;, i);
    this-&gt;data = buf;
    return *this;
}

String&amp; String::operator = (float i){
    char* buf = new char[128];
    sprintf(buf, &quot;%f&quot;, i);
    this-&gt;data = buf;
    return *this;
}

String&amp; String::operator = (double i){
    char* buf = new char[128];
    sprintf(buf, &quot;%f&quot;, i);
    this-&gt;data = buf;
    return *this;
}

String&amp; String::operator = (const char* ca){
    // Einfach formuliert ca den const charakter nehmen
    *this = const_cast&lt;char*&gt;(ca);
    return *this;
}
</code></pre>
<p>Test</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;main.h&quot;

using namespace std;

int main()
{
    try{
        String s;
        s = &quot;3&quot;;

        int i = 300;
        float f = 5.56;

        s &lt;&lt; f;
        i &lt;&lt; s; // Hier tritt der Fehler auf...

        cout &lt;&lt; i &lt;&lt; endl;
        cout &lt;&lt; f &lt;&lt; endl;
        cout &lt;&lt; s &lt;&lt; endl;

    }catch(...){
        cout &lt;&lt; &quot;Uncatched Exception occured.&quot; &lt;&lt; endl;
        return -1;
    }

    return 0;
}
</code></pre>
<p>Danke.<br />
Blackskyliner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1856862</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1856862</guid><dc:creator><![CDATA[Blackskyliner]]></dc:creator><pubDate>Wed, 17 Feb 2010 07:14:20 GMT</pubDate></item><item><title><![CDATA[Reply to Finde Fehler in String Klasse nicht on Wed, 17 Feb 2010 08:23:13 GMT]]></title><description><![CDATA[<p>Copy-ctor und Copy-Zuweisung fehlen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1856877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1856877</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 17 Feb 2010 08:23:13 GMT</pubDate></item><item><title><![CDATA[Reply to Finde Fehler in String Klasse nicht on Wed, 17 Feb 2010 08:54:27 GMT]]></title><description><![CDATA[<p>Du hast die '<a href="http://tutorial.schornboeck.net/bigthree.htm" rel="nofollow">Regel der Drei</a>' nicht eingehalten.<br />
Kopierkonstruktor und Zuweisungsoperator fehlen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1856886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1856886</guid><dc:creator><![CDATA[Werner_logoff]]></dc:creator><pubDate>Wed, 17 Feb 2010 08:54:27 GMT</pubDate></item><item><title><![CDATA[Reply to Finde Fehler in String Klasse nicht on Wed, 17 Feb 2010 08:57:36 GMT]]></title><description><![CDATA[<p>Neben dem hast du ein schönes Speicherleck. Deine ganzen Operatoren fordern Speicher mit new an - aber nirgendwo wird der vorher angeforderte Speicher freigegeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1856887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1856887</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or__]]></dc:creator><pubDate>Wed, 17 Feb 2010 08:57:36 GMT</pubDate></item><item><title><![CDATA[Reply to Finde Fehler in String Klasse nicht on Wed, 17 Feb 2010 10:12:38 GMT]]></title><description><![CDATA[<p>Okay hab das jetzt so implementiert:</p>
<pre><code class="language-cpp">class String{
//[...]
        String(){
            this-&gt;data = NULL;
        };
        ~String(){
            if(this-&gt;data != NULL)
                delete this-&gt;data;
        };

        String(const String &amp;s)
        {
            this-&gt;data = new char[getLength(s.toChar())+1];
            strcpy(this-&gt;data, s.toChar());
        }

        String(char* &amp;s)
        {
            this-&gt;data = new char[getLength(s)+1];
            strcpy(this-&gt;data, s);
        }

        String const&amp; operator=(String const&amp; s)
        {
            String temp(s);
            std::swap(this-&gt;data, temp.data);
            return *this;
        }
//[...]
        int getLength(char* s) const{
            int i = 0;
            while(*s++ != '\0'){
                i++;
            }
            return i;
        };
        int getLength() const{
            return getLength(this-&gt;data);
        };
//[...]
}
</code></pre>
<p>Ist das so jetzt in Ordnung oder hab ich noch etwas übersehen? Nicht das ich nochmal irgendwann ein Problem bekomme...</p>
<p>Ist das swap() notwendig oder geht das auch kürzer?<br />
Ist der Initial Konstruktor String(){ this-&gt;data = NULL } sinnvoll?</p>
<p>Das mit dem Memoryleak stimmt... wird aber noch behoben.</p>
<p>Danke für die konstruktiven Beiträge, haben mir sehr weitergeholfen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>EDIT:<br />
Bin ich vor Memory leaks sicher, wenn ich folgendes mache:</p>
<pre><code class="language-cpp">String&amp; operator &lt;&lt; (String&amp; s, float i){
    // Auf einen String umbauen damit speicherleak verhindert werden kann..
    //char* buf = new char[128];
    String ss(128);
    sprintf(ss, &quot;%f&quot;, i);
    std::swap(s.data, ss.data);
    return s;
}
</code></pre>
<p>und dazu den Konstruktor</p>
<pre><code class="language-cpp">String(int i){
            this-&gt;data = new char[i];
        }
</code></pre>
<p>und den cast Operator</p>
<pre><code class="language-cpp">operator char*(){ return this-&gt;data; }
</code></pre>
<p>MFG<br />
Blackskyliner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1856902</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1856902</guid><dc:creator><![CDATA[Blackskyliner]]></dc:creator><pubDate>Wed, 17 Feb 2010 10:12:38 GMT</pubDate></item><item><title><![CDATA[Reply to Finde Fehler in String Klasse nicht on Wed, 17 Feb 2010 12:57:14 GMT]]></title><description><![CDATA[<p>Ich hätte noch ein paar Verbesserungsvorschläge/Anmerkungen zum Design:</p>
<p>Zeile 4: die Initialisierung des Zeigers mit Null ist unbedingt nötig da der Zeiger sonst zufällige Werte enthalten kann. Spätestens beim Aufruf des Destruktors führt dies zu Problemen, da ein ungültiger Pointer gelöscht wird. Die Initialisierung sollte aber über die Initialisierungsliste erfolgen. Bei einem char Pointer ist es zwar noch egal, aber du solltest dir grundsätzlich angewöhnen alle Member über die Initialisierungsliste zu initialisieren.</p>
<p>Zeile 7: delete prüft selbst ob ein Null Pointer gelöscht werden soll, deshalb ist diese Prüfung nicht nötig.</p>
<p>Zeile 17: der Parameter sollte const sein.</p>
<p>Zeile 30: hier solltest du die Standardfcunktion strlen benutzen. Einige Funktionen ( z.B. strlen , memcopy , ... ) werden vom Compiler nicht in Funktionsaufrufe übersetzt sondern durch inline Assembler ersetzt. Diese sind somit im allgemeinen schneller als alle in C möglichen implementierungen.</p>
<p>Zeile 37: in allen Stl Klassen heißt diese Methode size. Es ist immer sinnvoll sich an Standardbezeichnungsschemen zu halten, dies macht die Klase leichter benutzbar.</p>
<p>Die Typkonvertierungen über streamoperatoren finde ich etwas komisch und habe ich so noch nie gesehen.<br />
Ich finde für Typkonvertierungen boost::lexical_cast sehr interessant. Man muss für seine Klasse nur streamoperatoren definieren und kann von und nach allen Klassen konvertieren die dies auch tun.</p>
<p>Deine Änderungen finde ich aus folgenden Punkten problematisch:<br />
Eine Klasse sollte niemals ihre Implmentierungsdetails nach aussen geben. Es sollten also höchstens Zeiger auf konstante Daten zurückgegeben werden. Desweiteren würde ich bei einem string kosntruktor erwarten das er eine string repräsentation des übergebenen erstellt. Dieser Destruktor sollte, wenn unbedingt nötig, als explicit deklariert werden.</p>
<p>An der StringHelper Klasse finde ich den zyklische Bezug zur String Klasse problemetisch. Wenn du die Klasse irgendwann mal auslagern musst weil du sie auch woanders verwendest kann dir das Probleme machen. Wobei die Lösung hier recht einfach ist, du musst als Parameter nur char pointer anstatt String´s verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1857013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1857013</guid><dc:creator><![CDATA[christian99]]></dc:creator><pubDate>Wed, 17 Feb 2010 12:57:14 GMT</pubDate></item><item><title><![CDATA[Reply to Finde Fehler in String Klasse nicht on Wed, 17 Feb 2010 13:25:28 GMT]]></title><description><![CDATA[<p>Hab diverse Tipps berücksichtigt, bin aber nun bei einem Problem wo sich mir ein riesiges Speicherleck auftut, ich aber nicht weiß, wie ich es verhindern soll...</p>
<p>Ich definiere mir den Additionsoperator und geben ein neues Objekt zurück, damit die Daten des Ursprungstrings nicht verändert werden. (Temporäre String verkettung). Meines Wissenstandes nach muss ich ja dafür ein neues String Objekt erzeugen, welches ja dann aber leider nicht gelöscht wird... und da liegt der Hase im Pfeffer, wie umgehe ich das?</p>
<p>Die Operatoren Überladung:</p>
<pre><code class="language-cpp">String&amp; operator+(const char *text)
        {
            char *tmp;
            int Len=getLength()+StringHelper::getLength(text);
            tmp=new char[Len+1];
            strcpy(tmp,this-&gt;data);
            strcat(tmp,text);
            //delete vBuf;
            //vBuf=tmp;
            return *(new String(tmp));
        };

        String&amp; operator+(const String *text)
        {
            char *tmp;
            int Len=getLength()+text-&gt;getLength();
            tmp=new char[Len+1];
            strcpy(tmp,this-&gt;data);
            strcat(tmp,text-&gt;data);
            return *(new String(tmp));
        };
</code></pre>
<p>Ich weiß das es nicht gut ist ein neues Objekt zurück zu geben, aber das muss ich ja, da ich keine lokalen Referenzen weitergeben darf geschweige denn das Ausgangsobjekt verändern will...</p>
<p>Bin dankbar für jeden Tipp.</p>
<p>MFG<br />
Blackskyliner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1857028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1857028</guid><dc:creator><![CDATA[Blackskyliner]]></dc:creator><pubDate>Wed, 17 Feb 2010 13:25:28 GMT</pubDate></item><item><title><![CDATA[Reply to Finde Fehler in String Klasse nicht on Wed, 17 Feb 2010 13:45:32 GMT]]></title><description><![CDATA[<p>return String(tmp);</p>
<p>aber schau mal auch hier vorbei: <a href="http://tutorial.schornboeck.net/los/string.htm" rel="nofollow">http://tutorial.schornboeck.net/los/string.htm</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1857045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1857045</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 17 Feb 2010 13:45:32 GMT</pubDate></item><item><title><![CDATA[Reply to Finde Fehler in String Klasse nicht on Wed, 17 Feb 2010 13:48:06 GMT]]></title><description><![CDATA[<p>Blackskyliner schrieb:</p>
<blockquote>
<p>Meines Wissenstandes nach muss ich ja dafür ein neues String Objekt erzeugen, welches ja dann aber leider nicht gelöscht wird... und da liegt der Hase im Pfeffer, wie umgehe ich das?</p>
</blockquote>
<p>Arbeite mit automatischen Objekten, nicht mit dynamisch angeforderten.</p>
<pre><code class="language-cpp">String&amp; operator+(const char *text)
</code></pre>
<p><code>String&amp;</code> ist definitiv der falsche Rückgabetyp. Dass besitzende Referenzen auf von <code>new</code> angeforderten Speicher verweisen, ist zudem sehr unüblich.</p>
<pre><code class="language-cpp">// += als Memberfunktion, gibt Referenz auf eigenes Objekt zurück.
String&amp; String::operator+= (const char* rhs)
{
    // ...
    return *this;
}

// + als freie Funktion, greift auf += zu.
String operator+ (const String&amp; lhs, const char* rhs)
{
    String tmp(lhs);
    tmp += rhs;
    return tmp;
}
</code></pre>
<p>Zur Operatorüberladung kannst du dir <a href="http://magazin.c-plusplus.net/artikel/%DCberladung%20von%20Operatoren%20in%20CPlusPlus%20%28Teil%201%29" rel="nofollow">diesen Artikel</a> durchlesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1857046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1857046</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 17 Feb 2010 13:48:06 GMT</pubDate></item><item><title><![CDATA[Reply to Finde Fehler in String Klasse nicht on Wed, 17 Feb 2010 14:53:27 GMT]]></title><description><![CDATA[<p>Operatorüberladungen für const char* anzubieten ist bestenfalls eine reine Optimierung (und da würde ich zunächst an ein paar anderen Stellen ansetzen) sobald ein entsprechender Konvertierungsoperator existiert.</p>
<p>Die impliziten Konvertierungsoperatoren dürften relativ schnell zu Problemen führen.</p>
<pre><code class="language-cpp">String s;
long double foo = s;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1857119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1857119</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 17 Feb 2010 14:53:27 GMT</pubDate></item></channel></rss>