<?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[vererbung, kopieren und zuweisen]]></title><description><![CDATA[<p>Also ich habe ein Riesenproblem (für mich zumindest riesig)</p>
<p>Ich habe 3 Klassen Group, Node und Shape<br />
Node ist die Basisklasse von Group und Shape.</p>
<p>Group hat eine Liste in der Nodes gespeichert werden können.</p>
<p>Ich habe einen eigenen Kopier und Zuweisungsoperator für Node geschrieben.</p>
<p>Die Klasse Group soll Kinder hinzufügen können.</p>
<pre><code class="language-cpp">void sg::GroupNode::addChild(Node* child)
{
    Node* add_me = 0;
    if(GroupNode* gn = dynamic_cast&lt;GroupNode*&gt;(child))
    {
        add_me = new GroupNode(*gn);
    }
    this-&gt;children.push_back(add_me);
}
</code></pre>
<p>Aus Sicherheitsgründen wird von einem entsprechenden Knoten eine Kopie erstellt. &lt;Achtung hier habe ich jetzt nur den Test auf Group und nicht alle Varianten.</p>
<p>Aber hierfür benötige ich auch den Kopierkonstruktor für GroupNodes (oder?)</p>
<p>die Klasse Group sieht im Grunde so aus:</p>
<pre><code class="language-cpp">class GroupNode : public Node
{
    list&lt;Node*&gt; children;
}
</code></pre>
<p>Wenn ich jetzt eine Kopie von einem solchen Knoten anfertigen will, müsste dieser wenn ich mich nicht irre auch sämtliche Kinder mitkopieren.</p>
<p>Nun sollte der Kopierkonstruktor von Group folgendes tun:<br />
er soll den Kopierkonstruktor der Basisklasse aufrufen und dann alle Kinder kopieren.</p>
<p>Frage: geht das so:</p>
<p>(Antwort vorweg: nein, Compilermeldung:</p>
<blockquote>
<p>/src/groupnode.cpp:14: error: no match for ‘operator=’ in ‘iter = other-&gt;sg::GroupNode::children.std::list&lt;_Tp, _Alloc&gt;::begin [with _Tp = sg::Node*, _Alloc = std::allocator<a href="sg::Node*" rel="nofollow">sg::Node*</a>]()’</p>
</blockquote>
<p>Die Meldung verstehe ich schon mal nicht ...</p>
<pre><code class="language-cpp">sg::GroupNode::GroupNode(const sg::GroupNode&amp; other)  : Node(other)
{
    std::list&lt;sg::Node*&gt;::iterator iter;
    for(iter = other.children.begin(); iter != other.children.end(); iter++)
    {
        sg::Node* tmp = *iter;
        if( sg::GroupNode* copy_me = dynamic_cast&lt;sg::GroupNode*&gt;(tmp))
        {
            children.push_back(new sg::GroupNode(*copy_me));
        }
    }
}
</code></pre>
<p>In meiner Anwendung gibt es bisher nur Nodes und GroupNodes, der Rest kommt bald nach.</p>
<p>Ich poste gerne mehr Code con meiner kleinen Baustelle wenn notwendig...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/264214/vererbung-kopieren-und-zuweisen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 04:59:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/264214.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 04 Apr 2010 12:00:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to vererbung, kopieren und zuweisen on Sun, 04 Apr 2010 12:00:52 GMT]]></title><description><![CDATA[<p>Also ich habe ein Riesenproblem (für mich zumindest riesig)</p>
<p>Ich habe 3 Klassen Group, Node und Shape<br />
Node ist die Basisklasse von Group und Shape.</p>
<p>Group hat eine Liste in der Nodes gespeichert werden können.</p>
<p>Ich habe einen eigenen Kopier und Zuweisungsoperator für Node geschrieben.</p>
<p>Die Klasse Group soll Kinder hinzufügen können.</p>
<pre><code class="language-cpp">void sg::GroupNode::addChild(Node* child)
{
    Node* add_me = 0;
    if(GroupNode* gn = dynamic_cast&lt;GroupNode*&gt;(child))
    {
        add_me = new GroupNode(*gn);
    }
    this-&gt;children.push_back(add_me);
}
</code></pre>
<p>Aus Sicherheitsgründen wird von einem entsprechenden Knoten eine Kopie erstellt. &lt;Achtung hier habe ich jetzt nur den Test auf Group und nicht alle Varianten.</p>
<p>Aber hierfür benötige ich auch den Kopierkonstruktor für GroupNodes (oder?)</p>
<p>die Klasse Group sieht im Grunde so aus:</p>
<pre><code class="language-cpp">class GroupNode : public Node
{
    list&lt;Node*&gt; children;
}
</code></pre>
<p>Wenn ich jetzt eine Kopie von einem solchen Knoten anfertigen will, müsste dieser wenn ich mich nicht irre auch sämtliche Kinder mitkopieren.</p>
<p>Nun sollte der Kopierkonstruktor von Group folgendes tun:<br />
er soll den Kopierkonstruktor der Basisklasse aufrufen und dann alle Kinder kopieren.</p>
<p>Frage: geht das so:</p>
<p>(Antwort vorweg: nein, Compilermeldung:</p>
<blockquote>
<p>/src/groupnode.cpp:14: error: no match for ‘operator=’ in ‘iter = other-&gt;sg::GroupNode::children.std::list&lt;_Tp, _Alloc&gt;::begin [with _Tp = sg::Node*, _Alloc = std::allocator<a href="sg::Node*" rel="nofollow">sg::Node*</a>]()’</p>
</blockquote>
<p>Die Meldung verstehe ich schon mal nicht ...</p>
<pre><code class="language-cpp">sg::GroupNode::GroupNode(const sg::GroupNode&amp; other)  : Node(other)
{
    std::list&lt;sg::Node*&gt;::iterator iter;
    for(iter = other.children.begin(); iter != other.children.end(); iter++)
    {
        sg::Node* tmp = *iter;
        if( sg::GroupNode* copy_me = dynamic_cast&lt;sg::GroupNode*&gt;(tmp))
        {
            children.push_back(new sg::GroupNode(*copy_me));
        }
    }
}
</code></pre>
<p>In meiner Anwendung gibt es bisher nur Nodes und GroupNodes, der Rest kommt bald nach.</p>
<p>Ich poste gerne mehr Code con meiner kleinen Baustelle wenn notwendig...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1877447</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877447</guid><dc:creator><![CDATA[shisha]]></dc:creator><pubDate>Sun, 04 Apr 2010 12:00:52 GMT</pubDate></item><item><title><![CDATA[Reply to vererbung, kopieren und zuweisen on Sun, 04 Apr 2010 12:44:57 GMT]]></title><description><![CDATA[<p>Warum möchtest du eigentlich eine Kopie einfügen?<br />
Ansonsten wäre statt des ewigen Casten eine clone-Funbktion nicht schlecht:</p>
<pre><code class="language-cpp">class Node {
    virtual Node* clone() const {
        // ruft Kopierkonstruktor auf
        return new Node(*this);
    }
};

class Group : public Node {
    Group* clone() const {
        return new Group(*this);
    }
};
// usw
</code></pre>
<p>Wobei ich denke, entweder siehst du nur den Einsatz von Zeigern vor und verzichtest auf Kopiersemantik, oder du erlaubst Kopien und verwendest auch Values. Die Beispielimplementierung ist damit weniger ideal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1877456</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877456</guid><dc:creator><![CDATA[Zombie323]]></dc:creator><pubDate>Sun, 04 Apr 2010 12:44:57 GMT</pubDate></item><item><title><![CDATA[Reply to vererbung, kopieren und zuweisen on Sun, 04 Apr 2010 14:13:53 GMT]]></title><description><![CDATA[<p>Dennoch habe ich noch das Problem mit dem Iterator...<br />
was ist daran falsch?</p>
<p>Ich kann mir diese Fehlermeldung nicht erklären.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1877486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877486</guid><dc:creator><![CDATA[shisha]]></dc:creator><pubDate>Sun, 04 Apr 2010 14:13:53 GMT</pubDate></item><item><title><![CDATA[Reply to vererbung, kopieren und zuweisen on Sun, 04 Apr 2010 14:33:45 GMT]]></title><description><![CDATA[<p>Edit:Wie willst du auf <em>children</em> zugreifen, wenn es private ist?</p>
<pre><code class="language-cpp">class GroupNode : public Node
{
    list&lt;Node*&gt; children;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1877490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877490</guid><dc:creator><![CDATA[freaky]]></dc:creator><pubDate>Sun, 04 Apr 2010 14:33:45 GMT</pubDate></item><item><title><![CDATA[Reply to vererbung, kopieren und zuweisen on Sun, 04 Apr 2010 14:28:53 GMT]]></title><description><![CDATA[<p>shisha schrieb:</p>
<blockquote>
<p>Dennoch habe ich noch das Problem mit dem Iterator...<br />
was ist daran falsch?</p>
<p>Ich kann mir diese Fehlermeldung nicht erklären.</p>
</blockquote>
<p>Du brauchst nen const_iterator.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1877491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877491</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Sun, 04 Apr 2010 14:28:53 GMT</pubDate></item><item><title><![CDATA[Reply to vererbung, kopieren und zuweisen on Sun, 04 Apr 2010 14:52:57 GMT]]></title><description><![CDATA[<p>@ FreakY&lt;3Cpp:</p>
<p>ich befinde mich innerhalb der Klasse GroupNode, da habe ich Zugriff auf private Elemente</p>
<p>@ l'abra d'or</p>
<p>ohne dass ich es ausprobiert habe bisher:<br />
ich glaube das ist die lösung ^^</p>
<p>@ zombie</p>
<p>das mit clone war ne gute idee spart mir ne menge aufwand</p>
<p>so bis zum nächsten problem <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>kleine zwischenfrage:</p>
<pre><code class="language-cpp">sg::GroupNode::GroupNode(const sg::GroupNode&amp; other)  : Node(other)
</code></pre>
<p>das kann ich schon so machen oder kann das Probleme geben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1877504</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877504</guid><dc:creator><![CDATA[shisha]]></dc:creator><pubDate>Sun, 04 Apr 2010 14:52:57 GMT</pubDate></item><item><title><![CDATA[Reply to vererbung, kopieren und zuweisen on Sun, 04 Apr 2010 15:24:46 GMT]]></title><description><![CDATA[<p>shisha schrieb:</p>
<blockquote>
<p>@ FreakY&lt;3Cpp:<br />
ich befinde mich innerhalb der Klasse GroupNode, da habe ich Zugriff auf private Elemente</p>
</blockquote>
<p>Ah ich hab nicht darauf geachtet wo deine Methode ist, okay <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1877511</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877511</guid><dc:creator><![CDATA[freaky]]></dc:creator><pubDate>Sun, 04 Apr 2010 15:24:46 GMT</pubDate></item></channel></rss>