<?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[eigenes Objekt überschreiben]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe eine Bildklasse die ein rotate() Methode hat. Da die rotate-Funktion nicht in-place ist, hab ich mir gedacht ich erstell ein neues Bildobjekt, schreib da das neue Bild rein und überschreib dann das aktuelle Objekt mit dem neuen.<br />
Ungefähr so:</p>
<pre><code class="language-cpp">void Bild::rotate(int deg)
{
   //rotieren...
   Bild NeuesBild;
   //rotieren...

   //this = &amp;NeuesBild; //error: non-lvalue in assignment
   *this = NeuesBild; //kein Kompilierfehler
}
</code></pre>
<p>Allerdings bin ich mir jetzt nicht sicher, was für Fehler so auftreten können.<br />
Oder macht man sowas ganz anders?</p>
<p>MfG Caster</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/231308/eigenes-objekt-überschreiben</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 21:48:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/231308.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 08 Jan 2009 17:21:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to eigenes Objekt überschreiben on Thu, 08 Jan 2009 17:21:49 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe eine Bildklasse die ein rotate() Methode hat. Da die rotate-Funktion nicht in-place ist, hab ich mir gedacht ich erstell ein neues Bildobjekt, schreib da das neue Bild rein und überschreib dann das aktuelle Objekt mit dem neuen.<br />
Ungefähr so:</p>
<pre><code class="language-cpp">void Bild::rotate(int deg)
{
   //rotieren...
   Bild NeuesBild;
   //rotieren...

   //this = &amp;NeuesBild; //error: non-lvalue in assignment
   *this = NeuesBild; //kein Kompilierfehler
}
</code></pre>
<p>Allerdings bin ich mir jetzt nicht sicher, was für Fehler so auftreten können.<br />
Oder macht man sowas ganz anders?</p>
<p>MfG Caster</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1641951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1641951</guid><dc:creator><![CDATA[Caster]]></dc:creator><pubDate>Thu, 08 Jan 2009 17:21:49 GMT</pubDate></item><item><title><![CDATA[Reply to eigenes Objekt überschreiben on Thu, 08 Jan 2009 17:49:50 GMT]]></title><description><![CDATA[<p>Sofern der Kopierkonstruktor keine Probleme macht, sollte das so schon funktionieren. Auch wenn ich es ein wenig übertrieben finde jedesmal, wenn du eine Rotation machst ein neues Bild zu erzeugen. (Kommt allerdings auf deine Möglichkeiten an, ob du das wirklich so machen musst..)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1641967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1641967</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 08 Jan 2009 17:49:50 GMT</pubDate></item><item><title><![CDATA[Reply to eigenes Objekt überschreiben on Thu, 08 Jan 2009 20:19:56 GMT]]></title><description><![CDATA[<p>Jetzt hab ich aber immer noch ein Problem. Das eigentliche Bild ist eine Bitmap in einem dynamisch angelegtem Speicher. Ich hab keinen Kopier- bzw. in dem Fall eher Zuweisungsoperator (oder?) implementiert, da ich mir gedacht hab, dass es langt wenn ich den Zeiger auf den Speicher kopier, da ich das neu angelegte Objekt ja nicht mehr benötige. Allerdings wird nach nach der Zuweisung (der Überschreibung des alten Objektes) der Destruktor des neuen Objektes aufgerufen, da dieses ja innerhalb dieser Funktion instanziert wurde. Der Destruktor &quot;free'd&quot; jetzt aber den Speicher auf den der (kopierte) Zeiger weist und das neu erzeugt Bild ist somit weg.<br />
Kann ich den Aufruf des Desktruktors irgendwie verhindern?</p>
<p>MfG Caster</p>
<p>EDIT: Mir fällt grad ein, ich könnte ja einfach die Instanzen zählen und erst nach der letzen den Speicher freimachen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1642032</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1642032</guid><dc:creator><![CDATA[Caster]]></dc:creator><pubDate>Thu, 08 Jan 2009 20:19:56 GMT</pubDate></item><item><title><![CDATA[Reply to eigenes Objekt überschreiben on Thu, 08 Jan 2009 20:08:57 GMT]]></title><description><![CDATA[<p>Caster schrieb:</p>
<blockquote>
<p>Jetzt hab ich aber immer noch ein Problem. Das eigentliche Bild ist eine Bitmap in einem dynamisch angelegtem Speicher. Ich hab keinen Kopier- bzw. in dem Fall eher Zuweisungsoperator implementiert, da ich mir gedacht hab, dass es langt wenn ich den Zeiger auf den Speicher kopier, da ich das neu angelegte Objekt ja nicht mehr benötige. Allerdings wird nach nach der Zuweisung (der Überschreibung des alten Objektes) der Destruktor des neuen Objektes aufgerufen, da dieses ja innerhalb dieser Funktion instanziert wurde. Der Destruktor &quot;free'd&quot; jetzt aber den Speicher auf den der (kopierte) Zeiger weist und das neu erzeugt Bild ist somit weg.<br />
Kann ich den Aufruf des Desktruktors irgendwie verhindern?</p>
<p>MfG Caster</p>
</blockquote>
<p>Statt dessen solltest du eher einen korrekten Copy-Ctor/Assignment Operator implementieren, der tatsächlich die Daten auch kopiert. Dein Ansatz mit dem verhindern des Destruktoraufrufs ist völlig falsches Design.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1642040</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1642040</guid><dc:creator><![CDATA[Gate]]></dc:creator><pubDate>Thu, 08 Jan 2009 20:08:57 GMT</pubDate></item><item><title><![CDATA[Reply to eigenes Objekt überschreiben on Thu, 08 Jan 2009 20:29:21 GMT]]></title><description><![CDATA[<p>Aber so würde ich umsonst ein vl. 1MB großes Bild kopieren.<br />
Und zu der Sache mit dem Instanzen zählen: da müsste ich das inkrementieren des Zählers ja auch in dem Zuweisungsoperator machen und den Standard-Zuweisungoperator wieder selber implementieren... oh man.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1642048</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1642048</guid><dc:creator><![CDATA[Caster]]></dc:creator><pubDate>Thu, 08 Jan 2009 20:29:21 GMT</pubDate></item><item><title><![CDATA[Reply to eigenes Objekt überschreiben on Thu, 08 Jan 2009 20:48:06 GMT]]></title><description><![CDATA[<p>Wenn Du ein natürliches Design ohne Referenzzählung haben möchtest, wie wäre folgendes:</p>
<ul>
<li>eine Methode <code>void Bild::swap(Bild&amp; other)</code> , die nur den Bilddatenzeiger mit other tauscht</li>
<li><code>void rotate(Bild&amp; bild, int deg)</code> ist eine freie Funktion, die ein neues Bild anlegt, das Rotationsergebnis dort ablegt und dann <code>bild.swap(neuesBild)</code> macht (den swap mit this finde ich - komisch)</li>
<li>(opt.) der Copy-Ctor kopiert das gesamte Bild (tiefe Kopie)</li>
<li>(opt.) der Zuweisungsoperator nutzt Copy-and-Swap (s.a. Google)</li>
</ul>
<p>Die letzten beiden Punkte würden das Gesamtild imho noch abrunden, natürliches Kopierverhalten eben (es seidenn Du möchtest Referenzzählung, dann nimm am besten gleich std::tr1::shared_ptr <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/1642064</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1642064</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 08 Jan 2009 20:48:06 GMT</pubDate></item><item><title><![CDATA[Reply to eigenes Objekt überschreiben on Thu, 08 Jan 2009 21:50:00 GMT]]></title><description><![CDATA[<p>Ich hab mit jetzt mal den Quellcode von &quot;<a href="http://www.xdp.it/cximage.htm" rel="nofollow">CxImage</a>&quot; angeschaut und die machen das eigentlich auch nicht viel anders als ich; nur sie rufen manuell eine Destroy-Methode auf anstatt den Speicher im Destruktor freizugeben.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10648">@LordJaxom</a>: Deine Idee ist aber auch nicht schlecht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1642097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1642097</guid><dc:creator><![CDATA[Caster]]></dc:creator><pubDate>Thu, 08 Jan 2009 21:50:00 GMT</pubDate></item></channel></rss>