<?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[const return bei operator =]]></title><description><![CDATA[<p>Ich hab eine Aufgabe, die ich hoffentlich richtig verstehe:</p>
<blockquote>
<p>Overload = operator to assign the Polygon object to another. This member<br />
function should return const reference to the Polygon object invoking the<br />
member function. This member function should also test for self assignment.</p>
</blockquote>
<p>Dh doch, dass die Zuweisung keine Kopie sondern eine const referenz ist? Aber was heißt dass, dass ich die linke Seite nicht mehr modifizieren kann?<br />
Ich hab es so probiert:</p>
<pre><code class="language-cpp">const Polygon&amp; Polygon::operator =(const Polygon &amp; p){
	if(this != &amp;p){
		// NOT SELF

                // char arrays
		xPts = p.xPts;
		yPts = p.yPts;

		numberOfVertices = p.numberOfVertices;

	}

	return *this;

}
</code></pre>
<p>Ich verweise also direkt die Pointer von dem alten Objekt aufs neue, soweit ok und returne *this, aber müsste dass dann nicht const sein? Wenn ich sowas habe wie:</p>
<pre><code class="language-cpp">Polygon p1,p2;
p2 = p1;
p2.operation(); &lt;--- illegal?
</code></pre>
<p>Bei mir kann ich P2 dennoch fröhlich nutzen</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/194732/const-return-bei-operator</link><generator>RSS for Node</generator><lastBuildDate>Tue, 29 Sep 2026 15:15:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/194732.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 10 Oct 2007 11:11:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to const return bei operator = on Wed, 10 Oct 2007 11:11:29 GMT]]></title><description><![CDATA[<p>Ich hab eine Aufgabe, die ich hoffentlich richtig verstehe:</p>
<blockquote>
<p>Overload = operator to assign the Polygon object to another. This member<br />
function should return const reference to the Polygon object invoking the<br />
member function. This member function should also test for self assignment.</p>
</blockquote>
<p>Dh doch, dass die Zuweisung keine Kopie sondern eine const referenz ist? Aber was heißt dass, dass ich die linke Seite nicht mehr modifizieren kann?<br />
Ich hab es so probiert:</p>
<pre><code class="language-cpp">const Polygon&amp; Polygon::operator =(const Polygon &amp; p){
	if(this != &amp;p){
		// NOT SELF

                // char arrays
		xPts = p.xPts;
		yPts = p.yPts;

		numberOfVertices = p.numberOfVertices;

	}

	return *this;

}
</code></pre>
<p>Ich verweise also direkt die Pointer von dem alten Objekt aufs neue, soweit ok und returne *this, aber müsste dass dann nicht const sein? Wenn ich sowas habe wie:</p>
<pre><code class="language-cpp">Polygon p1,p2;
p2 = p1;
p2.operation(); &lt;--- illegal?
</code></pre>
<p>Bei mir kann ich P2 dennoch fröhlich nutzen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1381946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1381946</guid><dc:creator><![CDATA[Seikilos]]></dc:creator><pubDate>Wed, 10 Oct 2007 11:11:29 GMT</pubDate></item><item><title><![CDATA[Reply to const return bei operator = on Wed, 10 Oct 2007 11:13:10 GMT]]></title><description><![CDATA[<p>p2 ist auch nicht konstant, Du hast es ja eine Zeile darüber erst als nichtkonstant definiert. Nur der Rückgabewert von (p2 = p1) ist konstant.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1381948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1381948</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 10 Oct 2007 11:13:10 GMT</pubDate></item><item><title><![CDATA[Reply to const return bei operator = on Wed, 10 Oct 2007 11:14:05 GMT]]></title><description><![CDATA[<p>Hmm, was bedeutet es denn, wenn der Rückgabewert konstant ist? Und verstehe ich die Aufgabenstellung richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1381950</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1381950</guid><dc:creator><![CDATA[Seikilos]]></dc:creator><pubDate>Wed, 10 Oct 2007 11:14:05 GMT</pubDate></item><item><title><![CDATA[Reply to const return bei operator = on Wed, 10 Oct 2007 11:16:10 GMT]]></title><description><![CDATA[<p>Du mußt unterscheiden zwischen den internen Abläufen im Zuweisungsoperator (kopieren der Member) und dem Rückgabewert (der wird z.B. verwendet, wenn die Zuweisung im Inneren eines größeren Ausdrucks passiert - im einfachsten Fall eine Mehrfachzuweisung &quot;p3=p2=p1;&quot;).</p>
<p>PS: So, wie du den Operator jetzt definiert hast, ist er auch nicht besser als der automatisch generierte. (btw, was für einen Typ haben xPts und yPts - und wie agieren Copy-Ctor und Dtor mit ihnen?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1381951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1381951</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 10 Oct 2007 11:16:10 GMT</pubDate></item><item><title><![CDATA[Reply to const return bei operator = on Wed, 10 Oct 2007 11:21:13 GMT]]></title><description><![CDATA[<p>Polygon ist eine Klasse, die zwei int Arrays (wie komme ich auf char arrays) verwaltet. Nun steht halt oben die Aufgaben beschreibung und ich hab versucht, die umzusetzen, so wie es gemeint ist. Dass das ding meiner Meinung nach auch nichts bewirkt dachte ich auch.<br />
Dtor deleted [] die beiden, der Copy Ctor erstellt eine per Hand kopie der Werte und der Ctor initialisiert die mit einer Zahl (Tiefe des Arrays, hier weggelassen)</p>
<p>So ganz verstehe ich das Const aber nicht, auch bei mehrfachzuweisung nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1381954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1381954</guid><dc:creator><![CDATA[Seikilos]]></dc:creator><pubDate>Wed, 10 Oct 2007 11:21:13 GMT</pubDate></item><item><title><![CDATA[Reply to const return bei operator = on Wed, 10 Oct 2007 11:26:00 GMT]]></title><description><![CDATA[<p>Seikilos schrieb:</p>
<blockquote>
<p>Dtor deleted [] die beiden, der Copy Ctor erstellt eine per Hand kopie der Werte und der Ctor initialisiert die mit einer Zahl (Tiefe des Arrays, hier weggelassen)</p>
</blockquote>
<p>Dann ist hier der Punkt um anzusetzen. Ich denke schon dass in der Aufgabenstellung genug Mitdenken vorausgesetzt wird um zu meinen &quot;ein Polygon <strong>sinnvoll</strong> einem anderen zuweisen&quot;. Um zu ermitteln was zu &quot;sinnvoll&quot; noch fehlt, schaue Dir doch mal an was passiert wenn Du im momentanen Zustand ein Polygon konstruierst, ein zweites aus dem ersten kopierst (Copy-Ctor) und beide dann löscht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1381960</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1381960</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 10 Oct 2007 11:26:00 GMT</pubDate></item><item><title><![CDATA[Reply to const return bei operator = on Wed, 10 Oct 2007 11:32:22 GMT]]></title><description><![CDATA[<p>Seikilos schrieb:</p>
<blockquote>
<p>Polygon ist eine Klasse, die zwei int Arrays (wie komme ich auf char arrays) verwaltet. Nun steht halt oben die Aufgaben beschreibung und ich hab versucht, die umzusetzen, so wie es gemeint ist. Dass das ding meiner Meinung nach auch nichts bewirkt dachte ich auch.<br />
Dtor deleted [] die beiden, der Copy Ctor erstellt eine per Hand kopie der Werte und der Ctor initialisiert die mit einer Zahl (Tiefe des Arrays, hier weggelassen)</p>
</blockquote>
<p>Und im Zusammenspiel damit ist dein Zuweisungsoperator eine mittlere Katastrophe - auf der einen Seite hast du ein Speicherleck für die alten Daten des Ziels, auf der anderen Seite versuchst du später zweifach, die neu zugewiesenen Daten zu löschen (im Dtor beider beteiligten Polygone). Korrekterweise müsstest du dort die bisherigen Polygondaten delete[]n und anschließend die Daten des Quellpolygons in einen eigenen Datenblock kopieren.<br />
(wenn der Platz ausreicht, kannst du die Array-<em>Inhalte</em> auch einfach kopieren)</p>
<blockquote>
<p>So ganz verstehe ich das Const aber nicht, auch bei mehrfachzuweisung nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /></p>
</blockquote>
<p>In größeren Ausdrücken wird der Rückgabewert des Operators weitergegeben - &quot;p3=p2=p1;&quot; wird z.B. aufgelöst zu &quot;p3.operator=(p2.operator=(p1));&quot;. Indem der Rückgabetyp const gesetzt wird, verhinderst du, daß jemand schreibend über diesen Wert hantiert, z.B. per &quot;(p2=p1).operation();&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1381964</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1381964</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 10 Oct 2007 11:32:22 GMT</pubDate></item><item><title><![CDATA[Reply to const return bei operator = on Wed, 10 Oct 2007 11:47:18 GMT]]></title><description><![CDATA[<p>Ja, da kommt nichts gutes bei rum, weil der Speicher beim ersten löschen schon frei gegeben wird.</p>
<p>Dann also kopieren, war auch meine erste idee. Ich hab ja auch einen Copy Ctor, der beide arrays kopiert.<br />
Mein erster Ansatz dafür war auch sowas in die Richtung:</p>
<pre><code class="language-cpp">const Polygon&amp; Polygon::operator =(const Polygon &amp; p){
    if(this != &amp;p){
        // NOT SELF

        delete [] xPts;
        delete [] yPts;

        numberOfVertices = p.numberOfVertices;

        // Per hand die beiden Arrays kopieren

    }

    return *this;

}
</code></pre>
<p>Da fand ich die redundanz aber doof, weil ich ja das kopieren schon im copy ctor umgesetzt habe. Daraus wollt ich nach meiner Logik dies machen:</p>
<pre><code class="language-cpp">const Polygon&amp; Polygon::operator =(const Polygon &amp; p){
    if(this != &amp;p){
        // NOT SELF

        delete [] xPts;
        delete [] yPts;

        numberOfVertices = p.numberOfVertices;

        // Copy Ctor nutzen
        *this = Polygon(p);  // mein copy ctor nimmt ja Polygon &amp; als Param

    }

    return *this;

}
</code></pre>
<p>Da meckert er aber,'&lt;function-style-cast&gt;': 'const Polygon' kann nicht in 'Polygon' konvertiert werden.<br />
Heißt das ich hätte meinen Copy Ctor als const Polygon &amp; definieren sollen?</p>
<p>Edit: Hab den Copy Ctor als const Polygon &amp; definiert, nun knallt die Stelle *this = Polygon(p); mit ner Exception bad_alloc raus <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="😃"
    /></p>
<p>Edit2: Es klappt natürlich, wenn ich ein temp Objekt erstelle und alle wichtigen Variablen mit std::swap wechsel, aber mich interessiert, warum ich das da oben nicht machen kann</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1381968</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1381968</guid><dc:creator><![CDATA[Seikilos]]></dc:creator><pubDate>Wed, 10 Oct 2007 11:47:18 GMT</pubDate></item><item><title><![CDATA[Reply to const return bei operator = on Wed, 10 Oct 2007 11:47:58 GMT]]></title><description><![CDATA[<p>Seikilos schrieb:</p>
<blockquote>
<p>Da meckert er aber,'&lt;function-style-cast&gt;': 'const Polygon' kann nicht in 'Polygon' konvertiert werden.<br />
Heißt das ich hätte meinen Copy Ctor als const Polygon &amp; definieren sollen?</p>
</blockquote>
<p>Erstens das (wie ist denn die Signatur des Copy-Ctor's?) und zweitens hast du hier eine erstklassische Enlosrekursion eingebaut - &quot;*this=Polygon(p);&quot; ruft wieder erst den Copy-Ctor auf, um ein temporäres Polygon anzulegen - und anschließend operator=, um dieses temporäre Objekt nach this zu kopieren.</p>
<p>Wenn du Redundanzen vermeiden willst, dann nimm lieber den Copy-and-Swap Ansatz:</p>
<pre><code class="language-cpp">const Polygon&amp; Polygon::operator =(const Polygon &amp; p){
    if(this != &amp;p){
        // kopiere die Quelle in ein temporäres Objekt
        Polygon tmp(p);
        // vertausche Daten von *this und tmp
        // (das kannst du auch in eine eigene Funktion auslagern
        swap(xPts,tmp.xPts);
        swap(yPts,tmp.yPts);
        swap(numberOfVertices,tmp.numberOfVertices);
        // am Blockende wird tmp beseitigt und gibt seine Daten (die alten Daten von *this) wieder frei
    }

    return *this;

}
</code></pre>
<p>(alternativ kannst du anstelle der nackten Arrays auch std::vector&lt;&gt; verwenden - der kümmert sich um alles Notwendige von alleine)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1381974</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1381974</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 10 Oct 2007 11:47:58 GMT</pubDate></item><item><title><![CDATA[Reply to const return bei operator = on Wed, 10 Oct 2007 11:49:15 GMT]]></title><description><![CDATA[<p>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="🙂"
    /><br />
Mir war nicht klar, dass das eine Endlosrekursion ist und das dort wieder der = Operator benutzt werden würde</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1381977</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1381977</guid><dc:creator><![CDATA[Seikilos]]></dc:creator><pubDate>Wed, 10 Oct 2007 11:49:15 GMT</pubDate></item><item><title><![CDATA[Reply to const return bei operator = on Wed, 10 Oct 2007 11:57:36 GMT]]></title><description><![CDATA[<p>du kannst den Copy-Ctor nicht so ohne weiteres fuer ein bestehendes Objekt benutzen. Der Ctor ist naemlich nicht nur zum kopieren da, sondern auch um zu initialisieren, was im Zuweisungsoperator nicht mehr noetig ist. Was moeglich waere, ist, die Kopiersemantik, die in beiden Funktionen vorkommt, in eine (private) extrafunktion zu verlegen:</p>
<pre><code class="language-cpp">struct Polygon {
/*...*/

  Polygon(const Polygon&amp; p) {
    copydata(p);
  }

  const Polygon&amp; operator=(const Polygon&amp; rhs) {
    if (this != &amp;rhs) {
      delete[] xPts;
      delete[] yPts;
      copydata(rhs);
    }
    return *this;
  }

private:
  void copydata(const Polygon&amp; p) {
    numberOfVertices = p.numberOfVertices;
    xPts = new int[numberOfVertices];
    yPts = new int[numberOfVertices];
    std::copy_n(p.xPts, numberOfVertices, xPts);
    std::copy_n(p.yPts, numberOfVertices, yPts);
  }

  int* xPts;
  int* yPts;
  size_t numberOFVertices;
/*...*/
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1381984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1381984</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 10 Oct 2007 11:57:36 GMT</pubDate></item></channel></rss>