<?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[Speicherzugriffsfehler bei Klassenpointer]]></title><description><![CDATA[<p>Hallo,<br />
Ich versuche eine Klasse zu schreiben, mit der man mathematische Therme abspeichern kann. Dazu habe ich versucht, in die Klasse Zeiger auf sich selber zu speichern, um den rechten und linken Teil von Verknüpfungen jeweils im Therm zu speichern.<br />
Ich habe bis jetzt folgenden Code, der allerdings nicht funktioniert:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

template &lt;typename T = double&gt;
class Therm {
private:
    Therm&lt;T&gt;* par;
public:
    Therm&lt;T&gt; operator=(Therm&lt;T&gt;);
    Therm&lt;T&gt; operator+(Therm&lt;T&gt;);
    Therm();
    ~Therm();
};

template &lt;typename T&gt;
Therm&lt;T&gt;::Therm() {
    par = NULL;
}

template &lt;typename T&gt;
Therm&lt;T&gt;::~Therm() {
    delete[] par;
}

template &lt;typename T&gt;
Therm&lt;T&gt; Therm&lt;T&gt;::operator=(Therm&lt;T&gt; val) {
    if (val.par != NULL) {
	if (par == NULL) par = new Therm&lt;T&gt;[2];
	par[0] = val.par[0];
	par[1] = val.par[1];
    }
    return *this;
}

template &lt;typename T&gt;
Therm&lt;T&gt; Therm&lt;T&gt;::operator+(Therm&lt;T&gt; val) {
    Therm&lt;T&gt; result;
    result.par = new Therm&lt;T&gt;[2];
    result.par[0] = *this;
    result.par[1] = val;
    return result;
}

int main() {
    Therm &lt;&gt;x, y;
    y=x+x;                   //funktioniert einwandfrei
    x+x+x;                   //führt zu einem Speicherzugriffsfehler
}
</code></pre>
<p>Was habe ich falsch gemacht?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/309084/speicherzugriffsfehler-bei-klassenpointer</link><generator>RSS for Node</generator><lastBuildDate>Wed, 05 Aug 2026 12:09:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/309084.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 13 Oct 2012 18:26:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicherzugriffsfehler bei Klassenpointer on Sat, 13 Oct 2012 18:26:00 GMT]]></title><description><![CDATA[<p>Hallo,<br />
Ich versuche eine Klasse zu schreiben, mit der man mathematische Therme abspeichern kann. Dazu habe ich versucht, in die Klasse Zeiger auf sich selber zu speichern, um den rechten und linken Teil von Verknüpfungen jeweils im Therm zu speichern.<br />
Ich habe bis jetzt folgenden Code, der allerdings nicht funktioniert:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

template &lt;typename T = double&gt;
class Therm {
private:
    Therm&lt;T&gt;* par;
public:
    Therm&lt;T&gt; operator=(Therm&lt;T&gt;);
    Therm&lt;T&gt; operator+(Therm&lt;T&gt;);
    Therm();
    ~Therm();
};

template &lt;typename T&gt;
Therm&lt;T&gt;::Therm() {
    par = NULL;
}

template &lt;typename T&gt;
Therm&lt;T&gt;::~Therm() {
    delete[] par;
}

template &lt;typename T&gt;
Therm&lt;T&gt; Therm&lt;T&gt;::operator=(Therm&lt;T&gt; val) {
    if (val.par != NULL) {
	if (par == NULL) par = new Therm&lt;T&gt;[2];
	par[0] = val.par[0];
	par[1] = val.par[1];
    }
    return *this;
}

template &lt;typename T&gt;
Therm&lt;T&gt; Therm&lt;T&gt;::operator+(Therm&lt;T&gt; val) {
    Therm&lt;T&gt; result;
    result.par = new Therm&lt;T&gt;[2];
    result.par[0] = *this;
    result.par[1] = val;
    return result;
}

int main() {
    Therm &lt;&gt;x, y;
    y=x+x;                   //funktioniert einwandfrei
    x+x+x;                   //führt zu einem Speicherzugriffsfehler
}
</code></pre>
<p>Was habe ich falsch gemacht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2260087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2260087</guid><dc:creator><![CDATA[zeiger]]></dc:creator><pubDate>Sat, 13 Oct 2012 18:26:00 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriffsfehler bei Klassenpointer on Sat, 13 Oct 2012 18:35:19 GMT]]></title><description><![CDATA[<p>zeiger schrieb:</p>
<blockquote>
<p>Was habe ich falsch gemacht?</p>
</blockquote>
<p>Die Regel der 3 nicht eingehalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2260089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2260089</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sat, 13 Oct 2012 18:35:19 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriffsfehler bei Klassenpointer on Sat, 13 Oct 2012 18:37:25 GMT]]></title><description><![CDATA[<p>Es heisst uebrigens Term, nicht Therm.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2260091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2260091</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Sat, 13 Oct 2012 18:37:25 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriffsfehler bei Klassenpointer on Sat, 13 Oct 2012 18:38:07 GMT]]></title><description><![CDATA[<p>Was du da hast ist doch mehr oder weniger eine verkettete Liste?</p>
<p>Ich glaube, dein Problem liegt unter anderem im Design. Sicher, dass du nicht einfach ein dynamisches Array mit Zeigern auf deine Objekte haben willst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2260092</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2260092</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 13 Oct 2012 18:38:07 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriffsfehler bei Klassenpointer on Sat, 13 Oct 2012 19:35:12 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Was du da hast ist doch mehr oder weniger eine verkettete Liste?</p>
</blockquote>
<p>Das wird eher ein binärer Baum, wenn's mal groß ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2260109</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2260109</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Sat, 13 Oct 2012 19:35:12 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriffsfehler bei Klassenpointer on Sat, 13 Oct 2012 19:51:38 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Die Regel der 3 nicht eingehalten.</p>
</blockquote>
<p>Die Regel der 3? Tut mir leid, die kenne ich nicht.</p>
<p>Sone schrieb:</p>
<blockquote>
<p>Was du da hast ist doch mehr oder weniger eine verkettete Liste?</p>
</blockquote>
<p>Als verkettete Liste habe ich das auch schon probiert, indem ich Operatoren als Funktion auf einen bereits bestehenden Therm verstanden habe, das hat die selbe Fehlermeldung ausgelöst, zumal diese Lösung andere Probleme auslöst.</p>
<p>Sone schrieb:</p>
<blockquote>
<p>Ich glaube, dein Problem liegt unter anderem im Design. Sicher, dass du nicht einfach ein dynamisches Array mit Zeigern auf deine Objekte haben willst?</p>
</blockquote>
<p>Ein dynamisches Array wollte ich haben, ja, habe ich auch. Aber einen dynamischen Array aus Zeigern? Ist das nicht komplizierter? Oder hat das gewisse Vorteile, die ich jetzt gerade nicht sehe?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2260113</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2260113</guid><dc:creator><![CDATA[zeiger]]></dc:creator><pubDate>Sat, 13 Oct 2012 19:51:38 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriffsfehler bei Klassenpointer on Sat, 13 Oct 2012 19:53:22 GMT]]></title><description><![CDATA[<p>Arrays können so gut wie alles beinhalten, und sonderlich kompliziert ist das auf keinen Fall.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2260114</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2260114</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 13 Oct 2012 19:53:22 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriffsfehler bei Klassenpointer on Sat, 13 Oct 2012 20:09:08 GMT]]></title><description><![CDATA[<p>Ich habe es gerade mal geändert, sodass Zeiger genutzt werden. Das sieht dann so aus:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt; 

using namespace std; 

template &lt;typename T = double&gt; 
class Term { 
private: 
     Term&lt;T&gt;** par;         //geaendert
public: 
     Term&lt;T&gt; operator=(Term&lt;T&gt;); 
     Term&lt;T&gt; operator+(Term&lt;T&gt;); 
     Term(); 
     ~Term(); 
 }; 

template &lt;typename T&gt; 
 Term&lt;T&gt;::Term() { 
     par = NULL; 
 } 

template &lt;typename T&gt; 
 Term&lt;T&gt;::~Term() { 
     delete[] par; 
 } 

template &lt;typename T&gt; 
 Term&lt;T&gt; Term&lt;T&gt;::operator=(Term&lt;T&gt; val) { 
     if (val.par != NULL) { 
     if (par == NULL) par = new Term&lt;T&gt;*[2]; 
     *par[0] = *val.par[0];         //geaendert
     *par[1] = *val.par[1];         //geaendert
     } 
     return *this; 
 } 

template &lt;typename T&gt; 
 Term&lt;T&gt; Term&lt;T&gt;::operator+(Term&lt;T&gt; val) { 
     Term&lt;T&gt; result; 
     result.par = new Term&lt;T&gt;*[2]; 
     *result.par[0] = *this;      //geaendert
     *result.par[1] = val;        //geaendert
     return result; 
 } 

int main() { 
     Term &lt;&gt;x, y; 
     y=x+x;                   //funktioniert einwandfrei 
     x+x+x;                   //führt zu einem Speicherzugriffsfehler 
 }
</code></pre>
<p>Leider löst das immer noch den alten Fehler aus:<br />
&lt;zahl&gt; Speicherzugriffsfehler<br />
Was bedeutet das eigendlich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2260126</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2260126</guid><dc:creator><![CDATA[zeiger]]></dc:creator><pubDate>Sat, 13 Oct 2012 20:09:08 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriffsfehler bei Klassenpointer on Sat, 13 Oct 2012 20:09:31 GMT]]></title><description><![CDATA[<p>zeiger schrieb:</p>
<blockquote>
<p>manni66 schrieb:</p>
<blockquote>
<p>Die Regel der 3 nicht eingehalten.</p>
</blockquote>
<p>Die Regel der 3? Tut mir leid, die kenne ich nicht.</p>
</blockquote>
<p>Die drei sind der Destruktor, der Kopierkonstruktor und der Zuweisungsoperator - und die Faustregel ist: brauchst Du einen brauchst Du alle.<br />
Also fehlt Dir noch der Kopierkonstruktor.</p>
<p>Den operator+() nimmst Du raus und implementierst Ihn als freie Funktion. Und dann schaust Du Dir nochmal die Übergabe per Referenz an. Du übergibst quasi alles als value, was für viele temporäre Objekte sorgt und wahrscheinlich nicht das ist, was Du willst.<br />
Z.B. macht es keinen Sinn, dass der operator+() eine Kopie von *this zurückgibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2260127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2260127</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Sat, 13 Oct 2012 20:09:31 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriffsfehler bei Klassenpointer on Sun, 14 Oct 2012 15:11:10 GMT]]></title><description><![CDATA[<p>Ok, vielen Dank jetzt klappt es, zumindestens gibt es jetzt keine Fehlermeldungen.<br />
Problem war tatsächlich der Kopierkonstruktor, denn der hat die pointer der Parameter in den Funktionen, die keine Referenzen waren, kopiert, sodass sie im Destrukor zwei mal gelöscht wurden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2260312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2260312</guid><dc:creator><![CDATA[zeiger]]></dc:creator><pubDate>Sun, 14 Oct 2012 15:11:10 GMT</pubDate></item></channel></rss>