<?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[operator überladen, aber welchen?]]></title><description><![CDATA[<p>Hi,</p>
<p>wenn ich eine Klasse definieren..</p>
<pre><code class="language-cpp">class MyClass
{
   public:
      MyClass( const int a = 0 )
      {
         p = new double;
         setValue( a );
      }
      ~MyClass() {delete p; }

      void setValue( const int a ) const
      {
          *p = a;
      }

      void printValue() const
      {
         cout &lt;&lt; *p &lt;&lt; endl;
      }

      private:
         double* p;
};
</code></pre>
<p>dann kann ich das machen...</p>
<pre><code class="language-cpp">int main...
{
  ...
  MyClass a(2);
  MyClass b(12);

  a.printValue();
  b.printValue();
  ...
  return 0;
}
</code></pre>
<p>wenn aber b = a; dann bekomme ich</p>
<blockquote>
<p>*** glibc detected *** double free or corruption (fasttop):</p>
</blockquote>
<p>Ok. Wenn b <strong>=</strong> a; dann zeigen (weil die Zuweisung vom Compiler generiert wird und deshalb in diesem Fall fehlerhaft) a.p und b.p auf denselben Speicher.<br />
Das führt dann zu dem oben genannten Fehler.</p>
<p>Abhilfe:</p>
<pre><code class="language-cpp">MyClass&amp; operator=( const MyClass&amp; a)
{
   if( *this != &amp;a )
   {
      delete p;
      p = new double;
      *p = *a.p;
   }
   return *this;
}
</code></pre>
<p>Der operator nimmt also eine &quot;read-only&quot; Referenz auf der rechten Seite der Zuweisung, da wir nur die linke Seite ändern müssen.<br />
Jetzt sollten a.p und b.p nicht mehr auf den gleichen Speicherbereich zeigen.<br />
Jo, alles läuft.</p>
<p>Aber wenn ich</p>
<pre><code class="language-cpp">MyClass* a = new MyClass(2);
  MyClass* b = new MyClass(12);

  a-&gt;print();
  b-&gt;print();

  b = a;
</code></pre>
<p>ich bekomme</p>
<blockquote>
<p>*** glibc *** detected invalid pointer</p>
</blockquote>
<p>ich kann ja nicht den Operator von oben nehmen. Was muss ich überladen, damit die Zuweisung klappt?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/300050/operator-überladen-aber-welchen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 12 Aug 2026 23:45:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/300050.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 24 Feb 2012 08:13:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to operator überladen, aber welchen? on Fri, 24 Feb 2012 08:13:53 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>wenn ich eine Klasse definieren..</p>
<pre><code class="language-cpp">class MyClass
{
   public:
      MyClass( const int a = 0 )
      {
         p = new double;
         setValue( a );
      }
      ~MyClass() {delete p; }

      void setValue( const int a ) const
      {
          *p = a;
      }

      void printValue() const
      {
         cout &lt;&lt; *p &lt;&lt; endl;
      }

      private:
         double* p;
};
</code></pre>
<p>dann kann ich das machen...</p>
<pre><code class="language-cpp">int main...
{
  ...
  MyClass a(2);
  MyClass b(12);

  a.printValue();
  b.printValue();
  ...
  return 0;
}
</code></pre>
<p>wenn aber b = a; dann bekomme ich</p>
<blockquote>
<p>*** glibc detected *** double free or corruption (fasttop):</p>
</blockquote>
<p>Ok. Wenn b <strong>=</strong> a; dann zeigen (weil die Zuweisung vom Compiler generiert wird und deshalb in diesem Fall fehlerhaft) a.p und b.p auf denselben Speicher.<br />
Das führt dann zu dem oben genannten Fehler.</p>
<p>Abhilfe:</p>
<pre><code class="language-cpp">MyClass&amp; operator=( const MyClass&amp; a)
{
   if( *this != &amp;a )
   {
      delete p;
      p = new double;
      *p = *a.p;
   }
   return *this;
}
</code></pre>
<p>Der operator nimmt also eine &quot;read-only&quot; Referenz auf der rechten Seite der Zuweisung, da wir nur die linke Seite ändern müssen.<br />
Jetzt sollten a.p und b.p nicht mehr auf den gleichen Speicherbereich zeigen.<br />
Jo, alles läuft.</p>
<p>Aber wenn ich</p>
<pre><code class="language-cpp">MyClass* a = new MyClass(2);
  MyClass* b = new MyClass(12);

  a-&gt;print();
  b-&gt;print();

  b = a;
</code></pre>
<p>ich bekomme</p>
<blockquote>
<p>*** glibc *** detected invalid pointer</p>
</blockquote>
<p>ich kann ja nicht den Operator von oben nehmen. Was muss ich überladen, damit die Zuweisung klappt?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185038</guid><dc:creator><![CDATA[FrankTheFox]]></dc:creator><pubDate>Fri, 24 Feb 2012 08:13:53 GMT</pubDate></item><item><title><![CDATA[Reply to operator überladen, aber welchen? on Fri, 24 Feb 2012 08:20:53 GMT]]></title><description><![CDATA[<p>so ganz verstehe ich dich nicht. Du schreibst doch erst, dass alles läuft. Dann schreibst du, dass derselbe Code auf einmal nciht mehr läuft? Oder habe ich da etwas übersehen?</p>
<p>Was mir aber noch aufgefallen ist:</p>
<pre><code class="language-cpp">if( *this != &amp;a )
</code></pre>
<p>hier stimmt definitiv etwas nicht. überlege dir mal, was genau du hier vergleichst..</p>
<p>achso, und diese Zeile wird auch nicht funktionieren:</p>
<pre><code class="language-cpp">*p = *a.p;
</code></pre>
<p>Arrays können nicht per Zuweisung kopiert werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185041</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185041</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Fri, 24 Feb 2012 08:20:53 GMT</pubDate></item><item><title><![CDATA[Reply to operator überladen, aber welchen? on Fri, 24 Feb 2012 08:24:18 GMT]]></title><description><![CDATA[<p>FrankTheFox schrieb:</p>
<blockquote>
<pre><code class="language-cpp">MyClass* a = new MyClass(2);
  MyClass* b = new MyClass(12);

  a-&gt;print();
  b-&gt;print();

  b = a;
</code></pre>
<p>ich bekomme</p>
<blockquote>
<p>*** glibc *** detected invalid pointer</p>
</blockquote>
</blockquote>
<p>Du weist hier ein Pointer einem anderen zu. Das heißt, a und b zeigen hinterher auf das selbe MyClass-Objekt, nämlich auf das mit der 12. Auf das mit der 2 gibts nach der Zuweisung keinen Pointer mehr, du hast es aber auch nicht zerstört. Es hängt also auf ewig im Speicher rum (wenn nicht das Bestriebssystem so lieb wäre, den irgendwann wieder freizugeben). Nennt sich Speicherleck und ist Grund für die Fehlermeldung. Hat aber rein garnichts mit den Operatoren von MyClass zu tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185043</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185043</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 24 Feb 2012 08:24:18 GMT</pubDate></item><item><title><![CDATA[Reply to operator überladen, aber welchen? on Fri, 24 Feb 2012 08:33:09 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>jupp, hier sollte</p>
<pre><code class="language-cpp">if( this != &amp;a )
</code></pre>
<p>stehen.</p>
<p>Ich nutze keine Array's. Hier steht doch nur ein Zeiger auf ein double.</p>
<p>Ja! Wenn ich</p>
<pre><code class="language-cpp">MyClass a(2);
MyClass b(12);

... 
a=b;
</code></pre>
<p>dann stimmt's *<strong>b.p</strong> hängt planlos in Raum (unerreicht)<br />
weil b.p zeigt auf die gleiche Speicherstelle wie a.p. Wobei in diesem Fall...upps</p>
<p>nicht nur *b.p == *a.p sondern sogar b.p == a.p.</p>
<p>Tjo, dass sollte der operator richten...</p>
<p>Wenn ich aber die Objekte a und b über new erzeuge, dann funktioniert doch der<br />
Zuweisungsoperator nicht mehr. Wie kann ich denn dann a = b machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185047</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185047</guid><dc:creator><![CDATA[FrankTheFox]]></dc:creator><pubDate>Fri, 24 Feb 2012 08:33:09 GMT</pubDate></item><item><title><![CDATA[Reply to operator überladen, aber welchen? on Fri, 24 Feb 2012 08:39:04 GMT]]></title><description><![CDATA[<p>FrankTheFox schrieb:</p>
<blockquote>
<p>Ich nutze keine Array's. Hier steht doch nur ein Zeiger</p>
</blockquote>
<p>ähm... *ups*... ja, hast natürlich recht. Ist wohl doch noch zu früh <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Es geht dir hier doch nur ums Prinzip, das ist kein &quot;ernst gemeinter&quot; Code?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185051</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185051</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Fri, 24 Feb 2012 08:39:04 GMT</pubDate></item><item><title><![CDATA[Reply to operator überladen, aber welchen? on Fri, 24 Feb 2012 09:00:25 GMT]]></title><description><![CDATA[<p>Nö,</p>
<p>nur ein Beispiel um zu sehen was ich machen muss wenn:</p>
<p>A) Objektinstanz auf dem Heap<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--smiling_face_with_sunglasses"
      title="B)"
      alt="😎"
    /> Objektinstanz statisch durch Variablen dekl. ( ohne new )</p>
<p>für <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--smiling_face_with_sunglasses"
      title="B)"
      alt="😎"
    /> habe ich eine Lösung ( und ich denke auch verstanden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> )<br />
aber für A) nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185061</guid><dc:creator><![CDATA[FrankTheFox]]></dc:creator><pubDate>Fri, 24 Feb 2012 09:00:25 GMT</pubDate></item><item><title><![CDATA[Reply to operator überladen, aber welchen? on Fri, 24 Feb 2012 09:14:21 GMT]]></title><description><![CDATA[<p>A) Smartpointer. Welcher genau, kommt auf deine Anforderung an (unique, Referenzzählung, ...)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185065</guid><dc:creator><![CDATA[arghonaut]]></dc:creator><pubDate>Fri, 24 Feb 2012 09:14:21 GMT</pubDate></item><item><title><![CDATA[Reply to operator überladen, aber welchen? on Fri, 24 Feb 2012 09:18:08 GMT]]></title><description><![CDATA[<p>Meinst Du jetzt die Zuweisung?</p>
<p>Naja, bei b) weist Du ja objektA = objektB. Dasselbe musst Du bei a) auch machen. Und um aus einem Zeiger ein Objekt zu machen, gibt es den Stern-Operator. Sprich, (*zeigerA) ergibt objektA.</p>
<p>Ergo: Du weist zwei Objekte immer einander gleich zu, durch a = b. Wenn a ein Zeiger ist, musst Du aus a ein Objekt machen (dereferenzieren).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185066</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185066</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 24 Feb 2012 09:18:08 GMT</pubDate></item><item><title><![CDATA[Reply to operator überladen, aber welchen? on Fri, 24 Feb 2012 09:23:37 GMT]]></title><description><![CDATA[<p>Ok.</p>
<p>also muss ich:</p>
<pre><code class="language-cpp">MyClass* operator=( const MyClass* a)
...
</code></pre>
<p>sowas machen? Oder bin jetzt komplett neben der Spur?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185071</guid><dc:creator><![CDATA[FrankTheFox]]></dc:creator><pubDate>Fri, 24 Feb 2012 09:23:37 GMT</pubDate></item><item><title><![CDATA[Reply to operator überladen, aber welchen? on Fri, 24 Feb 2012 09:29:42 GMT]]></title><description><![CDATA[<p>Nein, die Zuweisung geht immer gleich vonstatten, nämlich von Objekt zu Objekt. Es gibt nur den einen operator=(Objekt const&amp; other) für die Kopie.</p>
<p>Du musst nur beim Zuweisen darauf achten, zwei Objekte zu haben.</p>
<pre><code class="language-cpp">Object a;
Object b; // Objekte
a = b; // Muster: OBJEKT = OBJEKT

Object* a;
Object* b; // Zeiger
           // Das Objekt, auf das a zeigt, ist &quot;*a&quot;
           // Das Objekt, auf das b zeigt, ist &quot;*b&quot;
// Übung: Kombiniere das Muster OBJEKT = OBJEKT und das Wissen, wie man aus Zeigern Objekte macht
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2185075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185075</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 24 Feb 2012 09:29:42 GMT</pubDate></item><item><title><![CDATA[Reply to operator überladen, aber welchen? on Fri, 24 Feb 2012 12:02:23 GMT]]></title><description><![CDATA[<p>Was Du beobachtest ist, was schief gehen kann, wenn man die 3er-Regel nicht beachtet. Es fehlt Dir nicht nur ein Zuweisungsoperator sondern auch ein Kopierkonstruktor.</p>
<p>FrankTheFox schrieb:</p>
<blockquote>
<pre><code class="language-cpp">MyClass&amp; operator=( const MyClass&amp; a)
{
   if( this != &amp;a )
   {
      delete p;
      p = new double;
      *p = *a.p;
   }
   return *this;
}
</code></pre>
</blockquote>
<p>Das ist leider nicht Ausnahme-sicher. new kann in die Hose gehen, in welchem Fall die Funktion verlassen wird, ohne, dass *this in einem gültigen Zustand ist.</p>
<p>FrankTheFox schrieb:</p>
<blockquote>
<p>Aber wenn ich</p>
<pre><code class="language-cpp">MyClass* a = new MyClass(2);
  MyClass* b = new MyClass(12);

  a-&gt;print();
  b-&gt;print();

  b = a;
</code></pre>
<p>ich bekomme</p>
<blockquote>
<p>*** glibc *** detected invalid pointer</p>
</blockquote>
<p>ich kann ja nicht den Operator von oben nehmen. Was muss ich überladen, damit die Zuweisung klappt?</p>
</blockquote>
<p>WTF?! Das sind normale, rohe Zeiger. Du kannst die Bedeutung des Zuweisungsoperators für rohe Zeiger nicht ändern. Die Zuweisung führt hier zu einem Speicherleck. Ich sehe nirgens ein delete, was zu der Fehlermeldung führen könnte.</p>
<p>So macht man das:</p>
<pre><code class="language-cpp">class indirect_int
{
  // Invariante: ptr zeigt immer auf ein
  // gueltiges int-Objekt.
  int* ptr;

public:

  indirect_int(int i=0)
  : ptr(new int(i))
  {}

  ~indirect_int()
  { delete ptr; }

  indirect_int(indirect_int const&amp; x) // copy ctor
  : ptr(new int(*x.ptr))
  {}

  void swap(indirect_int &amp; that)
  { std::swap(this-&gt;ptr,that.ptr); }

  indirect_int&amp; operator=(indirect_int temp) // copy assign
  { this-&gt;swap(temp); return *this; } // per &quot;copy &amp; swap&quot;-Trick

  int value() const
  { return *ptr; }

  void value(int newv)
  { *ptr = newv; }
};

inline void swap(indirect_int &amp; a, indirect_int &amp; b)
{ a.swap(b); }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2185134</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185134</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 24 Feb 2012 12:02:23 GMT</pubDate></item><item><title><![CDATA[Reply to operator überladen, aber welchen? on Fri, 24 Feb 2012 13:15:14 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// Übung: Kombiniere das Muster OBJEKT = OBJEKT und das Wissen, wie man aus Zeigern Objekte macht
</code></pre>
</blockquote>
<p>Hi, wieder do. Also wenn ich dich richtig verstanden habe muss das dann so gehen.</p>
<pre><code class="language-cpp">MyClass* a = new MyClass(2);
MyClass* b = new MyClass(12);

a-&gt;print();
b-&gt;print();

*b = *a;

b-&gt;print();

delete a;
delete b;
</code></pre>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>WTF?! Das sind normale, rohe Zeiger. Du kannst die Bedeutung des Zuweisungsoperators für rohe Zeiger nicht ändern. Die Zuweisung führt hier zu einem Speicherleck. Ich sehe nirgens ein delete, was zu der Fehlermeldung führen könnte.</p>
</blockquote>
<p>Mein Fehler:<br />
wenn der Code (statische Objekterstellung) ausgeführt wird kommt ohne Zuweisungoperator wohl ein glibc aberr ich habe die glibc's durcheinander gebracht:</p>
<blockquote>
<p>*** glibc detected *** /home/blabla : double free or corruption (fasttop)...</p>
</blockquote>
<p>Tjo, stimmt der new kann in die Hose gehen.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185171</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185171</guid><dc:creator><![CDATA[FrankTheFox]]></dc:creator><pubDate>Fri, 24 Feb 2012 13:15:14 GMT</pubDate></item><item><title><![CDATA[Reply to operator überladen, aber welchen? on Sat, 25 Feb 2012 10:45:03 GMT]]></title><description><![CDATA[<p>--</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185528</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sat, 25 Feb 2012 10:45:03 GMT</pubDate></item></channel></rss>