<?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= über copy-ctor implementieren?]]></title><description><![CDATA[<p>Hi,</p>
<p>da ich keine Lust habe operator= und copy-ctor zu schreiben, fand ich Folgendes:</p>
<pre><code class="language-cpp">class CopyableClass
{
public:
    CopyableClass(CopyableClass&amp; other); // wie auch immer implementiert
    // swap gebe es auch!
    CopyableClass&amp; operator=(CopyAbleClass other)
    {
        this-&gt;swap(*this, other);
    }
};
</code></pre>
<p>Jetzt habe ich aber kein swap. Wenn CopyableClass moveable ist, hätte ich gedacht, dass Folgenes geht:</p>
<pre><code class="language-cpp">class CopyableAndMoveableClass
{
public:
    CopyableClass(CopyableClass&amp; other); // wie auch immer implementiert
    // swap gibt's nicht, aber move-ctor + move-assignment-operator
    CopyableClass&amp; operator=(CopyAbleClass other)
    {
        *this = std::move(other);
    }
};
</code></pre>
<p>Aber der sagt, operator= sei dort mehrdeutig. Klingt auch erstmal einleuchtend.</p>
<p>Also:</p>
<pre><code class="language-cpp">class CopyableAndMoveableClass
{
public:
    CopyableAndMoveableClass(CopyableClass&amp; other); // wie auch immer implementiert
    // swap gibt's nicht, aber move-ctor + move-assignment-operator
    CopyableAndMoveableClass&amp; operator=(const CopyAbleClass&amp; other)
    {
        *this = std::move(CopyableAndMoveableClass(std::move(other)));
    }
};
</code></pre>
<p>Das Doppel-Move ist doch korrekt, oder? Der muss schließlich move-ctor und move-assignment-Operator nutzen, also brauchen wir hier zwei rvalue-Referenzen, somit darf das Ding nicht benannt sein, also zwei Mal move.</p>
<p>Jetzt habe ich mich aber recht weit verstrickt und frage Mal nach, ob daran etwas faul ist oder es eine bessere Lösung gibt. Mein copy-ctor macht eine deep copy. Ich könnte natürlich auch den Doppelcode in eine Funktion ausgliedern und von copy-ctor/copy-assignment-op aufrufen lassen, würdet ihr das eher empfehlen?</p>
<p>Nachteil ist natürlich, dass wir hier die Schreibarbeit mit zwei zusätzlichen Moves bezahlen. Aber die dürften doch eigentlich leicht wegzuoptimieren sein. Wir moven etwas in eine temporäre Variable und von dieser weiter. Also kann der doch wohl schlauerweise auch direkt von der Kopie moven. Ein move bleibt natürlich nicht aus, schießlich wollte ich unbedingt den copy-ctor nutzen.</p>
<p>Was denkt ihr?</p>
<p>Dankesehr <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/topic/314872/operator-über-copy-ctor-implementieren</link><generator>RSS for Node</generator><lastBuildDate>Fri, 31 Jul 2026 23:31:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/314872.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 16 Mar 2013 20:03:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to operator= über copy-ctor implementieren? on Sat, 16 Mar 2013 20:10:22 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>da ich keine Lust habe operator= und copy-ctor zu schreiben, fand ich Folgendes:</p>
<pre><code class="language-cpp">class CopyableClass
{
public:
    CopyableClass(CopyableClass&amp; other); // wie auch immer implementiert
    // swap gebe es auch!
    CopyableClass&amp; operator=(CopyAbleClass other)
    {
        this-&gt;swap(*this, other);
    }
};
</code></pre>
<p>Jetzt habe ich aber kein swap. Wenn CopyableClass moveable ist, hätte ich gedacht, dass Folgenes geht:</p>
<pre><code class="language-cpp">class CopyableAndMoveableClass
{
public:
    CopyableClass(CopyableClass&amp; other); // wie auch immer implementiert
    // swap gibt's nicht, aber move-ctor + move-assignment-operator
    CopyableClass&amp; operator=(CopyAbleClass other)
    {
        *this = std::move(other);
    }
};
</code></pre>
<p>Aber der sagt, operator= sei dort mehrdeutig. Klingt auch erstmal einleuchtend.</p>
<p>Also:</p>
<pre><code class="language-cpp">class CopyableAndMoveableClass
{
public:
    CopyableAndMoveableClass(CopyableClass&amp; other); // wie auch immer implementiert
    // swap gibt's nicht, aber move-ctor + move-assignment-operator
    CopyableAndMoveableClass&amp; operator=(const CopyAbleClass&amp; other)
    {
        *this = std::move(CopyableAndMoveableClass(std::move(other)));
    }
};
</code></pre>
<p>Das Doppel-Move ist doch korrekt, oder? Der muss schließlich move-ctor und move-assignment-Operator nutzen, also brauchen wir hier zwei rvalue-Referenzen, somit darf das Ding nicht benannt sein, also zwei Mal move.</p>
<p>Jetzt habe ich mich aber recht weit verstrickt und frage Mal nach, ob daran etwas faul ist oder es eine bessere Lösung gibt. Mein copy-ctor macht eine deep copy. Ich könnte natürlich auch den Doppelcode in eine Funktion ausgliedern und von copy-ctor/copy-assignment-op aufrufen lassen, würdet ihr das eher empfehlen?</p>
<p>Nachteil ist natürlich, dass wir hier die Schreibarbeit mit zwei zusätzlichen Moves bezahlen. Aber die dürften doch eigentlich leicht wegzuoptimieren sein. Wir moven etwas in eine temporäre Variable und von dieser weiter. Also kann der doch wohl schlauerweise auch direkt von der Kopie moven. Ein move bleibt natürlich nicht aus, schießlich wollte ich unbedingt den copy-ctor nutzen.</p>
<p>Was denkt ihr?</p>
<p>Dankesehr <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/2307251</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307251</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sat, 16 Mar 2013 20:10:22 GMT</pubDate></item><item><title><![CDATA[Reply to operator= über copy-ctor implementieren? on Sat, 16 Mar 2013 20:11:57 GMT]]></title><description><![CDATA[<pre><code>struct foo
{
	// normal implementieren
	foo(foo&amp;&amp;);
	foo(foo const&amp;);
	void swap(T&amp; other);

	// magic here
	foo&amp; operator = (foo other)
	{
		swap(other);
		return *this;
	}
};
</code></pre>
<p>Ist es das, was du willst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307252</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307252</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Sat, 16 Mar 2013 20:11:57 GMT</pubDate></item><item><title><![CDATA[Reply to operator= über copy-ctor implementieren? on Sat, 16 Mar 2013 20:17:52 GMT]]></title><description><![CDATA[<p>Theoretisch schon, aber ich habe kein swap, daher suche ich eine Lösung, die sich der moveability bereichert. Wie gesagt hat meine Variante jedoch Overhead. Ist der denn größer als beim copy-swap-Idiom?</p>
<p>Edit: Gut, swap zu implementieren ist nicht sonderlich schwierig. Trotzdem würde ich zum besseren Verständnis gerne meine Variante diskutieren. <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/2307257</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307257</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sat, 16 Mar 2013 20:17:52 GMT</pubDate></item><item><title><![CDATA[Reply to operator= über copy-ctor implementieren? on Sat, 16 Mar 2013 20:18:44 GMT]]></title><description><![CDATA[<p>Was hast du denn für eine Klasse, wo move-Operationen Sinn machen, swap aber nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307259</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307259</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 16 Mar 2013 20:18:44 GMT</pubDate></item><item><title><![CDATA[Reply to operator= über copy-ctor implementieren? on Sat, 16 Mar 2013 20:22:08 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Das Doppel-Move ist doch korrekt, oder? Der muss schließlich move-ctor und move-assignment-Operator nutzen, also brauchen wir hier zwei rvalue-Referenzen, somit darf das Ding nicht benannt sein, also zwei Mal move.</p>
</blockquote>
<p>Die Moves sehen mir beide falsch aus. Das innere tut gar nichts, da das Objekt nicht movebar ist. Das Aussere ist unnoetig, da temporaere Objekte direkt gemoved werden koennen.</p>
<p>Eisflamme schrieb:</p>
<blockquote>
<p>Theoretisch schon, aber ich habe kein swap, daher suche ich eine Lösung, die sich der moveability bereichert. Wie gesagt hat meine Variante jedoch Overhead. Ist der denn größer als beim copy-swap-Idiom?</p>
</blockquote>
<p>Implementier doch einfach swap, sehe das Problem nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307260</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307260</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Sat, 16 Mar 2013 20:22:08 GMT</pubDate></item><item><title><![CDATA[Reply to operator= über copy-ctor implementieren? on Sat, 16 Mar 2013 20:23:41 GMT]]></title><description><![CDATA[<p>hustbaer:<br />
Ist richtig, das ergibt durchaus Sinn und darum werde ich das jetzt auch so machen (hatte nicht an swap gedacht). Hat meine Variante denn bis auf schlechtere Lesbarkeit Nachteile?</p>
<p>Kellerautomat:<br />
Wieso ist das innere Objekt denn nicht movebar? Und das äußere brauche ich deswegen, weil mein MSVC sonst eine Doppeldeutigkeit meldet. Das direkte Moven ohne Angabe ist doch wohl eine Optimierung, oder nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307262</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sat, 16 Mar 2013 20:23:41 GMT</pubDate></item><item><title><![CDATA[Reply to operator= über copy-ctor implementieren? on Sat, 16 Mar 2013 20:23:57 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Wieso ist das innere Objekt denn nicht movebar?</p>
</blockquote>
<p>Weil es const ist.</p>
<p>Eisflamme schrieb:</p>
<blockquote>
<p>Und das äußere brauche ich deswegen, weil mein MSVC sonst eine Doppeldeutigkeit meldet. Das direkte Moven ohne Angabe ist doch wohl eine Optimierung, oder nicht?</p>
</blockquote>
<p>Glaube ich dir nicht. Es ist eine Temporary und damit ein RValue. Keine Optimierung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307264</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Sat, 16 Mar 2013 20:23:57 GMT</pubDate></item><item><title><![CDATA[Reply to operator= über copy-ctor implementieren? on Sat, 16 Mar 2013 20:28:07 GMT]]></title><description><![CDATA[<p>Aber Moment, beim swap muss ich doch wieder alles schreiben, was ich auch im copy-ctor mache, also löse ich damit mein Problem (keine Lust deep copy zwei Mal zu schreiben) doch eigentlich gar nicht.</p>
<p>Das mit const stimmt natürlich, albern. Aber ohne const&amp; habe ich die Doppeldeutigkeit. Also geht das so wohl nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307265</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307265</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sat, 16 Mar 2013 20:28:07 GMT</pubDate></item><item><title><![CDATA[Reply to operator= über copy-ctor implementieren? on Sat, 16 Mar 2013 20:31:06 GMT]]></title><description><![CDATA[<p>In swap swappst du alle Member. Was machst du denn im Copy Ctor?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307266</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307266</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Sat, 16 Mar 2013 20:31:06 GMT</pubDate></item><item><title><![CDATA[Reply to operator= über copy-ctor implementieren? on Sat, 16 Mar 2013 20:31:21 GMT]]></title><description><![CDATA[<p>Mach Dein Beispiel mal konkreter und weniger künstlich. Bitte auch vollständig kompilierbar, wenn's geht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307267</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307267</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 16 Mar 2013 20:31:21 GMT</pubDate></item><item><title><![CDATA[Reply to operator= über copy-ctor implementieren? on Sat, 16 Mar 2013 20:32:03 GMT]]></title><description><![CDATA[<p>Die Klasse ist ein Baum und die Nodes speichern den Parent, den muss ich dann korrigieren, ist halt keine triviale Kopie.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307268</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307268</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sat, 16 Mar 2013 20:32:03 GMT</pubDate></item><item><title><![CDATA[Reply to operator= über copy-ctor implementieren? on Sat, 16 Mar 2013 20:34:58 GMT]]></title><description><![CDATA[<p>Was hat die Klasse für Datenelemente?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307269</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 16 Mar 2013 20:34:58 GMT</pubDate></item><item><title><![CDATA[Reply to operator= über copy-ctor implementieren? on Sat, 16 Mar 2013 20:43:09 GMT]]></title><description><![CDATA[<p>Bis auf ein paar native Typen eine struct-Instanz (die kann Copy und Move aber) und einen vector auf eine wiederum andere Klasse, die wiederum nur einfach kopierbare Elemente (zwei ints und eine Strukturinstanz, die nur ints hat) enthält.</p>
<p>Also wenn ich nicht die Parent- und Neighborzeiger der struct-Instanz (bzw. eines Datenmembers davon) ändern müsste, dann wäre swap schnell gemacht. Genau so wie copy-ctor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307274</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sat, 16 Mar 2013 20:43:09 GMT</pubDate></item><item><title><![CDATA[Reply to operator= über copy-ctor implementieren? on Sat, 16 Mar 2013 20:51:46 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Aber Moment, beim swap muss ich doch wieder alles schreiben, was ich auch im copy-ctor mache, also löse ich damit mein Problem (keine Lust deep copy zwei Mal zu schreiben) doch eigentlich gar nicht.</p>
</blockquote>
<p>Ein Trugschluss. Da ist kein Duplikation drin. swap macht schließlich auch etwas mit dem alten Inhalt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307277</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307277</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 16 Mar 2013 20:51:46 GMT</pubDate></item><item><title><![CDATA[Reply to operator= über copy-ctor implementieren? on Sat, 16 Mar 2013 21:04:47 GMT]]></title><description><![CDATA[<p>Stimmt. Aber das klappt nur, weil die zeigerhaltenden Elemente der Klasse moveable sind, oder? Sonst würde swap ja nicht move sondern copy aufrufen und schon wären die Zeiger wieder schrott.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307282</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sat, 16 Mar 2013 21:04:47 GMT</pubDate></item><item><title><![CDATA[Reply to operator= über copy-ctor implementieren? on Sat, 16 Mar 2013 21:04:59 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>[...]</p>
</blockquote>
<p>Dann klinke ich mich hier mal aus. Das ist mir zu schwammig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307283</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307283</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 16 Mar 2013 21:04:59 GMT</pubDate></item><item><title><![CDATA[Reply to operator= über copy-ctor implementieren? on Sat, 16 Mar 2013 22:38:10 GMT]]></title><description><![CDATA[<p>Man kann mein Problem eigentlich ziemlich stark vereinfachen, nämlich auf einen Baum, deren Kinder den Parent und Gruppenmitglieder kennen, die in einer bestimmten Beziehung zum Node stehen.</p>
<pre><code class="language-cpp">class Node
{
public:
    typedef std::unique_ptr&lt;Node&gt; NodePtr;
    typedef std::vector&lt;NodePtr&gt; NodePtrs;
    typedef std::vector&lt;const Node*&gt; ConstNodePtrs;
    // ...

private:
    NodePtrs children;
    ConstNodePtr parent; // natürlich ohne Besitz, ist jetzt korrigiert
    ConstNodePtrs specialNeighbors;
};
</code></pre>
<p>Das Ding soll moveable und copyable sein, wie löst man das sauber? Habe gerade Mal ins std::set reingeschaut, aber das ist mir mit den ganzen Basisklassen, Proxyobjekten und Allokatoren gerade etwas unübersichtlich geworden.</p>
<p>Hm, da fällt mir auf, dass mein Problem doch nicht gelöst ist. Wenn ich move oder swappe, muss der parent-Ptr ja doch wieder angepasst werden. Dafür auch nur der, aber diese Anpassung habe ich trotzdem wieder doppelt (wie gesagt in OP, auslagerbar ist die).</p>
<p>Gut, dann wäre meine aktuelle Lösung so was:</p>
<pre><code class="language-cpp">Node::Node(const Node&amp;&amp; other) : parent(std::move(other.parent)), children(std::move(other.children)), specialNeighbors(std::move(other.specialNeighbors))
{
    // foreach children: parent = this setzen
}

Node&amp; Node::operator=(Node&amp;&amp; other) 
{
    parent = std::move(other.parent);
    children = std::move(other.children);
    specialNeighbors = std::move(other.specialNeighbors);

    // foreach children: parent = this setzen
}

Node::Node(const Node&amp; other) : parent(other.parent), children(other.children), specialNeighbors(other.specialNeighbors)
{
    // deep copy, das ist einiger Aufwand
}

void Node::swap(Node&amp; other)
{
    std::swap(parent, other.parent);
    std::swap(children, other.children);
    std::swap(specialNeighbors, other.specialNeighbors);

    // wieder Anpassung des Parent von children
}

Node&amp; Node::operator=(const Node&amp; other)
{
    swap(other); // gut, hier Mal verkürzt
    return *this;
}
</code></pre>
<p>Ungetestet, weil hier im Forum getippt. Habt ihr Verbesserungsvorschläge?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307284</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307284</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sat, 16 Mar 2013 22:38:10 GMT</pubDate></item><item><title><![CDATA[Reply to operator= über copy-ctor implementieren? on Sat, 16 Mar 2013 22:10:31 GMT]]></title><description><![CDATA[<p>Erstmal zu swap: Das lustige an copy-and-swap ist, dass es quasi automatisch auch zu einem move-and-swap geworden ist. Und ich halte das auch für etwas, bei dem man den Wortlaut im Standard vielleicht noch einmal überdenken sollte. Denn nach dem ist</p>
<pre><code>T&amp; operator = (const T&amp;); // Copy Assignment
T&amp; operator = (T&amp;&amp;); // Move Assignment
</code></pre>
<p>Hm, wie konnte man solche Überladungen noch mal zusammen legen? Ah, genau!</p>
<pre><code>T&amp; operator = (T); // Copy Assignment + Move Assignment
</code></pre>
<p>Für den Standard ist das allerdings nur ein copy assignment operator, was etwas lustig ist. Praktisch gesehen sollte das aber eigentlich keinen Unterschied machen.</p>
<p>Dann zu deinem Problem: Müssen die Nodes <strong>wirklich</strong> ihren Parent kennen? Ich frage weil ich diese Struktur schon oft an Stellen gesehen habe, an denen das nicht nötig war, und einfach nur alles verkompliziert hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307300</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sat, 16 Mar 2013 22:10:31 GMT</pubDate></item><item><title><![CDATA[Reply to operator= über copy-ctor implementieren? on Sat, 16 Mar 2013 22:28:14 GMT]]></title><description><![CDATA[<p>Edit:<br />
Okay, also swap habe ich jetzt richtig kapiert, also gibt es wirklich den doppel-wirksamen operator=, der mit swap funktioniert. Wunderschön! <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>Bzgl. Parent- und Neighbor-Kenntnis. Ich kann das jetzt nur wieder anhand einem hoffentlich geeigneten Parallelbeispiel ausdrücken. Ein Node ist bei mir so etwas wie eine Menge und ein Child ist eine Untermenge. Die Untermengen sind disjunkt. Grundsätzlich kann aber die Menge einfach alle - sagen wir Mal - natürichen Zahlen enthalten.</p>
<p>Dann könnte man es weiter beschreiben mit: node-&gt;SetzeZahl(10); und das soll nur funktionieren, wenn:<br />
- 10 nicht in der Obermenge (Parent) ist<br />
- 10 nicht bereits in einer disjunkten Menge (SpecialNeighbors) ist</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307301</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307301</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sat, 16 Mar 2013 22:28:14 GMT</pubDate></item><item><title><![CDATA[Reply to operator= über copy-ctor implementieren? on Sat, 16 Mar 2013 22:36:14 GMT]]></title><description><![CDATA[<p>Aber so wie das da aussieht, besitzt eine Node ihr Parent und ihre Children. Macht das wirklich Sinn?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307306</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sat, 16 Mar 2013 22:36:14 GMT</pubDate></item><item><title><![CDATA[Reply to operator= über copy-ctor implementieren? on Sat, 16 Mar 2013 22:37:39 GMT]]></title><description><![CDATA[<p>Oh, nein, sorry. Mein Beispiel ist falsch...</p>
<p>Besitz ist natürlich nur von den children. Hab's oben korrigiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307308</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307308</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sat, 16 Mar 2013 22:37:39 GMT</pubDate></item><item><title><![CDATA[Reply to operator= über copy-ctor implementieren? on Sat, 16 Mar 2013 23:18:41 GMT]]></title><description><![CDATA[<p>Kopier- und Move-Semantik für so eine Node-Klasse ergibt für mich gar keinen Sinn. Das ist eher die Sache der übergeordneten Tree-Klasse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307317</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307317</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 16 Mar 2013 23:18:41 GMT</pubDate></item><item><title><![CDATA[Reply to operator= über copy-ctor implementieren? on Sat, 16 Mar 2013 23:27:15 GMT]]></title><description><![CDATA[<p>Hm, das ist bei mir jetzt halt ein Abwasch. Um das Beispiel von den Mengen weiterzuverwenden ist es eben so, dass der Top-Node auch markierte Zahlen hat. Und wenn ich in der Tree-Klasse so etwas wie Root-Node mache, muss ich nahezu alle Methoden daran weiterleiten. Oder man muss sich als Anwender stets den Root-Node holen und die Operationen darauf ausführen (der Baum kam erst später mit rein). Das finde ich auch nicht sonderlich schön.</p>
<p>Also mit dem Beispiel der Mengen, ich will ja einfach schreiben:</p>
<pre><code class="language-cpp">Menge menge;
menge.setzeZahl(10);
menge.setzeZahl(20);

Menge&amp; untermenge = menge.erzeugeKind();
untermenge.setzeZahl(15); // führt zu nichts
untermenge.setzeZahl(10); // gut
</code></pre>
<p>So finde ich das von der Bedienung her intuitiv. Oder sollte ich das nicht wollen? Wie würdest Du das denn dann umsetzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307318</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sat, 16 Mar 2013 23:27:15 GMT</pubDate></item><item><title><![CDATA[Reply to operator= über copy-ctor implementieren? on Sat, 16 Mar 2013 23:34:00 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Wie würdest Du das denn dann umsetzen?</p>
</blockquote>
<p>Was denn genau? Entweder bin ich blind, oder du hast immer noch nicht verraten, was das werden soll...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307322</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 16 Mar 2013 23:34:00 GMT</pubDate></item><item><title><![CDATA[Reply to operator= über copy-ctor implementieren? on Sat, 16 Mar 2013 23:52:51 GMT]]></title><description><![CDATA[<p>Ich hab das mit den Mengen doch ziemlich gut auf ein Minimalbeispiel reduziert, denke ich. Genau das ist das im Originalcode auch, nur mit allen möglichen Zusatzsachen und Mengen, deren Einträge ich noch erläutern müsste. Aber die Details sind für die Implementierung oder mein Problem alle unwesentlich.</p>
<p>Also es handelt sich um einen Mengenbaum und die Kind-Elemente sind Untermengen. Die Untermengen mit gleichem Parent sind wie gesagt disjunkt. Wenn der Benutzer etwas einfügen möchte, soll die Methode daher prüfen:</p>
<ol>
<li>ob die Zahl bereits in einer anderen Menge auf derselben Ebene drin ist</li>
<li>ob die Zahl auch in der Obermenge drin ist, sonst lässt sie sich nicht einfügen</li>
</ol>
<p>Edit: Vielleicht sollte man noch dazu sagen, dass diese Mengen über ein UI befüllt werden sollen. Im UI kann man quasi in einer großen Matrix die Zahlen anklicken. Wenn die Zahl nicht in der Obermenge ist, wird die Zahl aber ausgegraut und ein Klick über Menge.setzeZahl(10); führt eben zu nichts. Man kann sich aussuchen, welche Menge man gerade befüllen möchte.</p>
<p>Gerne liefere ich mehr Details, dafür müsste ich aber auch wissen, was noch als wichtig erachtet wird. <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>Edit: Ich meine, im Prinzip würde ich nur gerne, wenn ich lese &quot;Node copy/moveability ergibt keinen Sinn&quot; hören, wie es denn Sinn ergäbe. Du meintest ja &quot;Tree drüberhauen&quot;, dann habe ich gesagt, wieso ich das unschön finde. Und jetzt würde ich wiederum gerne hören, dass meine Argumente in aller Regel für die Tonne sind (und wieso) oder dass das durchaus Sinn ergibt. Dass ich nicht nach einer supertollen Komplettlösung fragen kann, wenn ich die ganzen Detailinfos nicht biete, ist mir klar. Ihr sollt mir da ja auch keine Arbeit abnehmen. Keine Ahnung, ob meine Antwort-Wünsche jetzt total unangemessen sind...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307324</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307324</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sat, 16 Mar 2013 23:52:51 GMT</pubDate></item><item><title><![CDATA[Reply to operator= über copy-ctor implementieren? on Sun, 17 Mar 2013 00:55:21 GMT]]></title><description><![CDATA[<p>krümelkacker hat schon recht, du kannst logischerweise eh immer nur die root-node moven, weil du zum moven Besitz-&quot;Rechte&quot; brauchst, und an die kommste von außen erst mal nicht. Und wenn die Root-Node dann auch ein unique_ptr&lt;node&gt; und keine node ist, dann musst du nur den moven und kannst den ganzen anderen Kram aus der node-Klasse raus holen.</p>
<p>Kopieren ist allerdings etwas anderes, denn das geht auch mit Teilbäumen. Ist halt die Frage, ob man das überhaupt braucht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307331</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307331</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sun, 17 Mar 2013 00:55:21 GMT</pubDate></item></channel></rss>