<?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[Frage zum Ueberladen von Operatoren]]></title><description><![CDATA[<p>Hallo allerseits,</p>
<p>ich bin relativ neu mit C++ und verzweifle an folgendem Problem:<br />
Bin dabei, mir eine Klasse namens matrix fuer komplexe Matrizen zu schreiben.<br />
Dazu muss ich in der Klasse die Operatoren +,= etc. ueberladen. Hab die mal so definiert:</p>
<pre><code>matrix operator+(matrix&amp;);[code]
void operator=(matrix*);
</code></pre>
<p>und dann so implementiert:</p>
<pre><code>matrix matrix::operator+(matrix &amp;M)
{
   matrix C = matrix(dim);
   for (char i=0; i&lt;dim; i++)
   {
      for (char j=0; j&lt;dim; j++)
      {
         (C).set(get(i,j)+M.get(i,j),i,j);
      };
   };
   return (C);	
};

void matrix::operator=(matrix* M)
{
   for (char i=0; i&lt;dim; i++)
   {
      for(char j=0; j&lt;dim; j++)
      {
	 set((*M).get(i,j),i,j);
      };
   };
};
</code></pre>
<p>(set und get setzen bzw. liefern das entsprechende Matrixelement).<br />
Nun das Problem:</p>
<pre><code>matrix A;
matrix B;
matrix C;
A+B;               //funktioniert
A=B;               //funktioniert
A = B+C;      //funktioniert nicht!
</code></pre>
<p>Bei der letzten Zeile kommt vom Compiler der Fehler, dass der &quot;=&quot;-Operator mit dem Argument nicht definiert ist.<br />
Funktionieren tut es, wenn ich fuer den &quot;+&quot;-Operatoren matrix&amp; als Rueckgabe-Typ verwende:</p>
<pre><code>matrix&amp; matrix::operator+(matrix &amp;M)
{
   matrix* C = new matrix(dim);
   for (char i=0; i&lt;dim; i++)
   {
      for (char j=0; j&lt;dim; j++)
      {
         (*C).set(get(i,j)+M.get(i,j),i,j);
      };
   };
   return *C;	
};
</code></pre>
<p>In dem Fall habe ich aber das Problem, dass ich mit new eine neue Matrix anlegen<br />
muss, die nicht mehr geloescht wird. Das fuehrt in meinem Programm, fuer die<br />
die Klasse benoetigt wird, recht schnell dazu, dass der Speicher ueberlaeuft <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="😞"
    /></p>
<p>Waere toll wenn mir irgendjemand einen Tip haette, bin echt am Verzweifeln, so langsam...</p>
<p>Gruß, Fabian</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/199580/frage-zum-ueberladen-von-operatoren</link><generator>RSS for Node</generator><lastBuildDate>Sat, 03 Oct 2026 17:35:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/199580.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 04 Dec 2007 17:45:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zum Ueberladen von Operatoren on Tue, 04 Dec 2007 17:45:06 GMT]]></title><description><![CDATA[<p>Hallo allerseits,</p>
<p>ich bin relativ neu mit C++ und verzweifle an folgendem Problem:<br />
Bin dabei, mir eine Klasse namens matrix fuer komplexe Matrizen zu schreiben.<br />
Dazu muss ich in der Klasse die Operatoren +,= etc. ueberladen. Hab die mal so definiert:</p>
<pre><code>matrix operator+(matrix&amp;);[code]
void operator=(matrix*);
</code></pre>
<p>und dann so implementiert:</p>
<pre><code>matrix matrix::operator+(matrix &amp;M)
{
   matrix C = matrix(dim);
   for (char i=0; i&lt;dim; i++)
   {
      for (char j=0; j&lt;dim; j++)
      {
         (C).set(get(i,j)+M.get(i,j),i,j);
      };
   };
   return (C);	
};

void matrix::operator=(matrix* M)
{
   for (char i=0; i&lt;dim; i++)
   {
      for(char j=0; j&lt;dim; j++)
      {
	 set((*M).get(i,j),i,j);
      };
   };
};
</code></pre>
<p>(set und get setzen bzw. liefern das entsprechende Matrixelement).<br />
Nun das Problem:</p>
<pre><code>matrix A;
matrix B;
matrix C;
A+B;               //funktioniert
A=B;               //funktioniert
A = B+C;      //funktioniert nicht!
</code></pre>
<p>Bei der letzten Zeile kommt vom Compiler der Fehler, dass der &quot;=&quot;-Operator mit dem Argument nicht definiert ist.<br />
Funktionieren tut es, wenn ich fuer den &quot;+&quot;-Operatoren matrix&amp; als Rueckgabe-Typ verwende:</p>
<pre><code>matrix&amp; matrix::operator+(matrix &amp;M)
{
   matrix* C = new matrix(dim);
   for (char i=0; i&lt;dim; i++)
   {
      for (char j=0; j&lt;dim; j++)
      {
         (*C).set(get(i,j)+M.get(i,j),i,j);
      };
   };
   return *C;	
};
</code></pre>
<p>In dem Fall habe ich aber das Problem, dass ich mit new eine neue Matrix anlegen<br />
muss, die nicht mehr geloescht wird. Das fuehrt in meinem Programm, fuer die<br />
die Klasse benoetigt wird, recht schnell dazu, dass der Speicher ueberlaeuft <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="😞"
    /></p>
<p>Waere toll wenn mir irgendjemand einen Tip haette, bin echt am Verzweifeln, so langsam...</p>
<p>Gruß, Fabian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1414932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1414932</guid><dc:creator><![CDATA[fabian555]]></dc:creator><pubDate>Tue, 04 Dec 2007 17:45:06 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Ueberladen von Operatoren on Tue, 04 Dec 2007 17:53:33 GMT]]></title><description><![CDATA[<p>Ein Fehler hat sich eingeschlichen, tut mir leid:<br />
Der Gleichheitsoperator sieht so aus:</p>
<pre><code>void matrix::operator=(matrix&amp; M)
{
   for (char i=0; i&lt;dim; i++)
   {
      for(char j=0; j&lt;dim; j++)
      {
         set(M.get(i,j),i,j);
      };
   };
};
</code></pre>
<p>Gruß, Fabian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1414937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1414937</guid><dc:creator><![CDATA[fabian555]]></dc:creator><pubDate>Tue, 04 Dec 2007 17:53:33 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Ueberladen von Operatoren on Tue, 04 Dec 2007 19:06:50 GMT]]></title><description><![CDATA[<p>Um das &quot;sauber&quot; hinzubekommen könnte man folgenden Weg gehen:</p>
<p>1. Copy-Konstruktor überladen (sowieso wichtig!)</p>
<p>2. += Operator überladen, das würde dann so aussehen</p>
<pre><code class="language-cpp">matrix&amp; matrix::operator+=(const matrix&amp; rhs)
     {
        // addiere rhs zu &quot;this&quot;
        return *this;
     }
</code></pre>
<p>3. Zuweisungs(=) Operator überladen</p>
<pre><code class="language-cpp">matrix&amp; matrix::operator=(const matrix &amp;rhs) {

    //hier zuerst auf Selbstzuweisung prüfen
    if (this != &amp;rhs) {
     // hier wird die Kopierlogik implementiert, wobei 
     // hier auch das Löschen des Heaps des &quot;alten&quot; Objekts erfolgt
    }

    return *this;
}
</code></pre>
<p>4. + Operator als Nicht-Member implementieren (aber eventuell als friend)</p>
<pre><code class="language-cpp">matrix operator+(const matrix&amp; lhs, const matrix&amp; rhs)
     {
         matrix ret(lhs);  // hierfür ist z.B. der Copy-Konstruktor nötig
         ret += rhs;      
         return ret; 
     }
</code></pre>
<p>Puh, hoffe ich hab nichts vergessen <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/1414970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1414970</guid><dc:creator><![CDATA[vic1986]]></dc:creator><pubDate>Tue, 04 Dec 2007 19:06:50 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Ueberladen von Operatoren on Wed, 05 Dec 2007 10:20:30 GMT]]></title><description><![CDATA[<p>Liegt der Fehler hier nicht einfach darin, dass er beim operator+ eine Kopie zurèck gibt, der operator= aber eine Referenz erwartet (und das temporäre Objekt in der Form keine Adresse besitzt) Ich bin mir etwas unsicher, ob das tatsächlich einen Fehler gibt, bitte also um bestätigung/Korrektur.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1415187</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415187</guid><dc:creator><![CDATA[Shinja (nicht eingeloggt)]]></dc:creator><pubDate>Wed, 05 Dec 2007 10:20:30 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Ueberladen von Operatoren on Wed, 05 Dec 2007 13:06:32 GMT]]></title><description><![CDATA[<p>Vielen Dank Vic86,</p>
<p>dank deiner Hilfe habe ich es jetzt hinbekommen. Wuesste allerdings doch gerne<br />
noch, was genau mein Fehler war. Der entscheidende Punkt muesste doch sein,<br />
dass ich vorher den +-Operator als Member-Funktion mit nur einem Argument geschrieben habe. Versteh aber nicht, warum das einen Unterschied machen sollte.</p>
<p>Verwirrte Grueße,<br />
Fabian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1415256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415256</guid><dc:creator><![CDATA[fabian555]]></dc:creator><pubDate>Wed, 05 Dec 2007 13:06:32 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Ueberladen von Operatoren on Wed, 05 Dec 2007 13:09:47 GMT]]></title><description><![CDATA[<p>Siehe shinjas Beitrag: Was den Unterschied macht, ist die Tatsache, daß op= eine (nicht konstante) Referenz entgegengenommen hat und op+ einen temporären Wert zurückgibt - der Compiler darf eine Referenz nicht an einen temporären Wert binden (hängt mit deren Lebensdauer zusammen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1415258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415258</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 05 Dec 2007 13:09:47 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Ueberladen von Operatoren on Wed, 05 Dec 2007 13:14:24 GMT]]></title><description><![CDATA[<p>Du hattest beim Zuweisungsoperator eine nicht-konstante Referenz als Parameter angegeben, aber als Rückgabe vom Additionsoperator ein Matrixobjekt und dieses temp. Objekt würde nach dem Aufruf wieder zerstört werden.<br />
Da der Compiler annimmt, daß bei einer nicht-konstanten Referenz eine Änderung innerhalb der Funktion erfolgt, erzeugt er einen Fehler.</p>
<p>Daher beachte bei möglichst allen Übergaben, daß du einen Parameter als &quot;const T&amp;&quot; deklarierst, sofern du nicht wirklich eine Kopie oder eine Referenz benötigst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1415263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415263</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Wed, 05 Dec 2007 13:14:24 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Ueberladen von Operatoren on Wed, 05 Dec 2007 14:39:43 GMT]]></title><description><![CDATA[<p>Ok, jetzt hab ichs verstanden, vielen Dank!</p>
<p>Fabian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1415325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415325</guid><dc:creator><![CDATA[fabian555]]></dc:creator><pubDate>Wed, 05 Dec 2007 14:39:43 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Ueberladen von Operatoren on Thu, 06 Dec 2007 05:08:02 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">matrix&amp; matrix::operator=(const matrix &amp;rhs) { 

    //hier zuerst auf Selbstzuweisung prüfen 
    if (this != &amp;rhs) { 

     // hier wird die Kopierlogik implementiert, wobei 
     // hier auch das Löschen des Heaps des &quot;alten&quot; Objekts erfolgt 

     // WARUM SOLL HIER...
    } 

    return *this; 
}
</code></pre>
<p>... der Heap des Altern Objekt gelöscht werden? das Alte objekt existiert doch weiter, und gilt nur als Source Objekt für das neue... ? Oder hab ic hwas übersehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1415583</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415583</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Thu, 06 Dec 2007 05:08:02 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Ueberladen von Operatoren on Thu, 06 Dec 2007 06:54:31 GMT]]></title><description><![CDATA[<p>Das Objekt selber existiert noch, deine alten Daten nicht mehr. Wenn die Matrix eine feste Größe hat, ist es kein Problem, die Daten zu überschreiben - bei einer variablen Größe ist es einfacher, einen neuen Speicherbereich anzulegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1415589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415589</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 06 Dec 2007 06:54:31 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Ueberladen von Operatoren on Thu, 06 Dec 2007 06:56:45 GMT]]></title><description><![CDATA[<p>BorisDieKlinge schrieb:</p>
<blockquote>
<p>das Alte objekt existiert doch weiter, und gilt nur als Source Objekt für das neue... ? Oder hab ic hwas übersehen?</p>
</blockquote>
<p>Mit &quot;das alte Objekt&quot; ist nicht das Quellobjekt rhs gemeint, sondern das, was vor der Zuweisung in *this stand.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1415590</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415590</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 06 Dec 2007 06:56:45 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Ueberladen von Operatoren on Thu, 06 Dec 2007 07:02:42 GMT]]></title><description><![CDATA[<p>oh sorry.. haben aneinander vorbvei geredet, habe zuerst mit &quot;altem&quot; Objekt das &quot;scr&quot; objekt nicht das &quot;dest&quot; objekt gemeint.. dann ist klar :xmas2:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1415593</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415593</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Thu, 06 Dec 2007 07:02:42 GMT</pubDate></item></channel></rss>