<?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[In Elementfunktion eigene Klasse neu erzeugen]]></title><description><![CDATA[<p>Hi liebe Leute,</p>
<p>ich habe ein Problem mit einer Funktion zum ändern der Größe meiner Klasse.</p>
<p>Ich möchte gern eine Code-Duplizierung vermeiden und die Größenänderung so gestalten:</p>
<pre><code class="language-cpp">void klasse::resize(int neuzeilen, int neuspalten) {
delete this;
this = new klasse(neuzeilen,neuspalten); //Fehler: this ist kein l-value
}
</code></pre>
<p>die festlegung der größe und speicherreservierung habe ich im konstruktor definiert. um den code ( <code>data = new datentyp[m]; for(...) data[i]=new datenyp[n];</code> ) nicht doppelt eingeben zu müssen, würde ich also gern den konstruktor aufrufen und die größe dadurch verändern.</p>
<p>aber so wie in zeile 3 geht das nicht, weil this kein lvalue ist.<br />
wie geht also also sonst? <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>nur den konstruktor aufzurufen funktioniert auch nicht. ( <code>klasse(neuzeilen,neuspalten);</code> )</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/228621/in-elementfunktion-eigene-klasse-neu-erzeugen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 28 Sep 2026 11:32:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/228621.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 30 Nov 2008 18:38:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to In Elementfunktion eigene Klasse neu erzeugen on Sun, 30 Nov 2008 18:38:28 GMT]]></title><description><![CDATA[<p>Hi liebe Leute,</p>
<p>ich habe ein Problem mit einer Funktion zum ändern der Größe meiner Klasse.</p>
<p>Ich möchte gern eine Code-Duplizierung vermeiden und die Größenänderung so gestalten:</p>
<pre><code class="language-cpp">void klasse::resize(int neuzeilen, int neuspalten) {
delete this;
this = new klasse(neuzeilen,neuspalten); //Fehler: this ist kein l-value
}
</code></pre>
<p>die festlegung der größe und speicherreservierung habe ich im konstruktor definiert. um den code ( <code>data = new datentyp[m]; for(...) data[i]=new datenyp[n];</code> ) nicht doppelt eingeben zu müssen, würde ich also gern den konstruktor aufrufen und die größe dadurch verändern.</p>
<p>aber so wie in zeile 3 geht das nicht, weil this kein lvalue ist.<br />
wie geht also also sonst? <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>nur den konstruktor aufzurufen funktioniert auch nicht. ( <code>klasse(neuzeilen,neuspalten);</code> )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1623456</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1623456</guid><dc:creator><![CDATA[hermesasl]]></dc:creator><pubDate>Sun, 30 Nov 2008 18:38:28 GMT</pubDate></item><item><title><![CDATA[Reply to In Elementfunktion eigene Klasse neu erzeugen on Sun, 30 Nov 2008 18:40:04 GMT]]></title><description><![CDATA[<p>operator= nutzen:</p>
<pre><code class="language-cpp">*this = klasse(neuzeilen,neuspalten);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1623458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1623458</guid><dc:creator><![CDATA[The-Kenny]]></dc:creator><pubDate>Sun, 30 Nov 2008 18:40:04 GMT</pubDate></item><item><title><![CDATA[Reply to In Elementfunktion eigene Klasse neu erzeugen on Sun, 30 Nov 2008 20:03:43 GMT]]></title><description><![CDATA[<p>das funktioniert leider nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> er versucht, aus nichtreservierten speicher zuzugreifen (laufzeitfehler).</p>
<pre><code class="language-cpp">template &lt;class datentyp&gt;
void Matrix&lt;datentyp&gt;::resize(const int iAnzZeilen, const int iAnzSpalten) {
    delete this;

    //hiermit funktioniert es und dies ist auch der code aus dem konstruktor:
    //a=new datentyp*[iAnzZeilen];
    //for(int i=0;i&lt;iAnzZeilen;i++) a[i]=new datentyp[iAnzSpalten];
    //m=iAnzZeilen;
    //n=iAnzSpalten;

    *this = Matrix&lt;datentyp&gt;(iAnzZeilen, iAnzSpalten); //verursacht laufzeitfehler
}
</code></pre>
<p>in meiner matrixklasse ist a** das array mit den elementen und m,n die zeilen-/spaltenanzahl.</p>
<p>(bitte keine tipps, welche klassen ich verwenden kann, es geht hierbei eher ums lernen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1623503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1623503</guid><dc:creator><![CDATA[hermesasl]]></dc:creator><pubDate>Sun, 30 Nov 2008 20:03:43 GMT</pubDate></item><item><title><![CDATA[Reply to In Elementfunktion eigene Klasse neu erzeugen on Sun, 30 Nov 2008 20:13:31 GMT]]></title><description><![CDATA[<p>hermesasl schrieb:</p>
<blockquote>
<p>das funktioniert leider nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> er versucht, aus nichtreservierten speicher zuzugreifen (laufzeitfehler).</p>
<pre><code class="language-cpp">delete this;
    
    ...

    *this = Matrix&lt;datentyp&gt;(iAnzZeilen, iAnzSpalten); //verursacht laufzeitfehler
}
</code></pre>
</blockquote>
<p>Ist doch logisch: Du gibst vorher den Speicher der Klasse frei und dereferenzierst danach den (inzwischen ungültigen) this-Zeiger. Außerdem solltest du bei solchen Sachen immer aufpassen: Wenn die Klasse nun ganz normal auf dem Stack angelegt wurde und du delete aufrufst, krachts genau so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1623506</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1623506</guid><dc:creator><![CDATA[devkid]]></dc:creator><pubDate>Sun, 30 Nov 2008 20:13:31 GMT</pubDate></item><item><title><![CDATA[Reply to In Elementfunktion eigene Klasse neu erzeugen on Sun, 30 Nov 2008 20:25:11 GMT]]></title><description><![CDATA[<p>mhh .. wie kann ich dann sonst den speicher reservieren und freigeben?<br />
man kann ja dem zeiger this nichts zuweisen, also <code>this = new Matrix&lt;datentyp&gt;(m,n);</code> geht ja nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1623510</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1623510</guid><dc:creator><![CDATA[hermesasl]]></dc:creator><pubDate>Sun, 30 Nov 2008 20:25:11 GMT</pubDate></item><item><title><![CDATA[Reply to In Elementfunktion eigene Klasse neu erzeugen on Sun, 30 Nov 2008 20:45:14 GMT]]></title><description><![CDATA[<p>hermesasl schrieb:</p>
<blockquote>
<p>mhh .. wie kann ich dann sonst den speicher reservieren und freigeben?<br />
man kann ja dem zeiger this nichts zuweisen, also <code>this = new Matrix&lt;datentyp&gt;(m,n);</code> geht ja nicht.</p>
</blockquote>
<p>Lösche einfach alles, was du im Konstruktor mit new angefordert hast und rufe danach den Konstruktor auf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1623518</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1623518</guid><dc:creator><![CDATA[devkid]]></dc:creator><pubDate>Sun, 30 Nov 2008 20:45:14 GMT</pubDate></item><item><title><![CDATA[Reply to In Elementfunktion eigene Klasse neu erzeugen on Sun, 30 Nov 2008 21:01:24 GMT]]></title><description><![CDATA[<p>genau darum geht ja meine frage:<br />
wie rufe ich den denn auf?</p>
<pre><code class="language-cpp">void Matrix&lt;datentyp&gt;::resize(const int iAnzZeilen, const int iAnzSpalten) {

    ///genau das steht im Destruktor:
    for(int i=0;i&lt;m;i++) delete[] a[i];
    delete[] a;

    ///das steht im Konstruktor:
    //a=new datentyp*[iAnzZeilen];
    //for(int i=0;i&lt;iAnzZeilen;i++) a[i]=new datentyp[iAnzSpalten];
    //m=iAnzZeilen;
    //n=iAnzSpalten;

    Matrix&lt;datentyp&gt;(iAnzZeilen, iAnzSpalten); //laufzeitfehler!
}
</code></pre>
<p>wenn ich nicht den konstruktor aufrufe, sondern den auskommentierten code, funktioniert es ja. aber ich möchte doch lieber den konstruktor verwenden <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1623528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1623528</guid><dc:creator><![CDATA[hermesasl]]></dc:creator><pubDate>Sun, 30 Nov 2008 21:01:24 GMT</pubDate></item><item><title><![CDATA[Reply to In Elementfunktion eigene Klasse neu erzeugen on Sun, 30 Nov 2008 21:06:12 GMT]]></title><description><![CDATA[<p>Wenn du den Konstruktor nicht selbst aufrufen kannst, dann verlagere doch deinen Code stattdessen in eine extra private Funktion __init () oder so und rufe diese Funktion dann im Konstruktor sowie in deiner resize () Funktion auf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1623531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1623531</guid><dc:creator><![CDATA[devkid]]></dc:creator><pubDate>Sun, 30 Nov 2008 21:06:12 GMT</pubDate></item><item><title><![CDATA[Reply to In Elementfunktion eigene Klasse neu erzeugen on Sun, 30 Nov 2008 21:38:28 GMT]]></title><description><![CDATA[<p>okay, dann mach ich das so ... hatte das auch schon im hinterkopf <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>danke für den tipp!</p>
<p>falls jemandem noch eine andere lösung einfällt, bin ich aber auch noch interessiert <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1623543</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1623543</guid><dc:creator><![CDATA[hermesasl]]></dc:creator><pubDate>Sun, 30 Nov 2008 21:38:28 GMT</pubDate></item><item><title><![CDATA[Reply to In Elementfunktion eigene Klasse neu erzeugen on Mon, 01 Dec 2008 00:45:22 GMT]]></title><description><![CDATA[<p>in der elementfunktion</p>
<pre><code class="language-cpp">new (this) matrix&lt;datentyp&gt; (iAnzzeilen, iAnzspalten);
</code></pre>
<p>aber was machst du, wenn eine exception auftritt?<br />
dann sind nämlich die alten daten alle weg, obwohl sie das nicht sein müssten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1623577</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1623577</guid><dc:creator><![CDATA[renewer]]></dc:creator><pubDate>Mon, 01 Dec 2008 00:45:22 GMT</pubDate></item><item><title><![CDATA[Reply to In Elementfunktion eigene Klasse neu erzeugen on Mon, 01 Dec 2008 05:54:17 GMT]]></title><description><![CDATA[<p>Du musst nur eine &quot;swap&quot; Funktion implementieren. Mit deren Hilfe kannst du dann operator = implementieren, und auch deine resize funktion:</p>
<pre><code class="language-cpp">void dings::swap(dings&amp; other)
{
    // in den meisten fällen musst du hier einfach nur alle member-variablen tauschen:
    std::swap(a, other.a);
    std::swap(m, other.m);
    std::swap(n, other.n);
}

dings&amp; dings::operator = (dings const&amp; other)
{
    dings temp(other);  // anderes dings kopieren
    swap(temp);         // dieses dings mit kopie von anderem dings tauschen
    return *this;       // fertig
}

void dings::resize(int newM, int newN)
{
    dings temp(newM, newN); // neues dings erstellen
    // ggf. noch daten von &quot;this&quot; nach &quot;temp&quot; kopieren
    swap(temp);             // dieses dings mit dem neuen dings tauschen
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1623596</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1623596</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 01 Dec 2008 05:54:17 GMT</pubDate></item><item><title><![CDATA[Reply to In Elementfunktion eigene Klasse neu erzeugen on Mon, 01 Dec 2008 12:33:22 GMT]]></title><description><![CDATA[<p>das hört sich gut an und vereinfacht auch noch andere sachen - danke <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1623763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1623763</guid><dc:creator><![CDATA[hermesasl]]></dc:creator><pubDate>Mon, 01 Dec 2008 12:33:22 GMT</pubDate></item><item><title><![CDATA[Reply to In Elementfunktion eigene Klasse neu erzeugen on Mon, 01 Dec 2008 15:03:15 GMT]]></title><description><![CDATA[<p>renewer schrieb:</p>
<blockquote>
<p>in der elementfunktion</p>
<pre><code class="language-cpp">new (this) matrix&lt;datentyp&gt; (iAnzzeilen, iAnzspalten);
</code></pre>
</blockquote>
<p>Wie gesagt eher schlecht, da du vorher evtl. das aktuelle Objekt freigeben musst (wenn es nicht auf dem Stack liegt - was du nicht so einfach feststellen kannst) und du dir dann noch für den Destruktor merken müsstes, wie das aktuelle Objekt erzeugt wurde (entweder vom Programmierer (Finger weg lassen) oder innerhalb des Klassen-Members (delete aufrufen)).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1623835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1623835</guid><dc:creator><![CDATA[devkid]]></dc:creator><pubDate>Mon, 01 Dec 2008 15:03:15 GMT</pubDate></item></channel></rss>