<?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[Baum-Design]]></title><description><![CDATA[<p>Ich weiß leider keinen besseren Titel^^</p>
<p>Also im Grunde habe ich einen Baum, der prinzipielle Aufbau ist:<br />
(ich lasse hier fast alle details weg)</p>
<pre><code class="language-cpp">class Node
{
public:
    Node* parent;
    int type;
    virtual void acceptVisitor()=0;
};
class GNode : Node
{
    std::list&lt;Node*&gt; children;
}

class SNode : Node
{
    interessante Dinge ...
}
</code></pre>
<p>Das ganze läuft auf einen Szenengraphen hinaus,<br />
die Visitor werden Solche wie sucheKamera, renderer, ...</p>
<p>Ich möchte nun noch eine Möglichkeit hinzufügen, bestimmte Knoten zu finden und zu manipulieren (zB löschen)</p>
<p>Da ich die Möglichkeit brauche einen Knoten zu löschen, glaube ich dass<br />
etwas wie:</p>
<pre><code class="language-cpp">Node::deleteMe()
{
    parent = 0;
    delete this;
}
</code></pre>
<p>schwachsinn ist, zwar weiß ich dass es nur zeiger geben wird aber das muss jemand anderes ja nicht wissen, ausserdem behagt mir die vorstellung gar nicht, dass ein Knoten sich selbst löschen kann...<br />
Da bei allen verschiedenen Arten von Knoten etwas anderes getan werden müsste,<br />
bin ich grad etwas unschlüssig, wie ich das ganze angehen soll.</p>
<p>Spontan in den Sinn kamen mir:</p>
<p>eine statische Funktion</p>
<pre><code class="language-cpp">Node::deleteNode(Node*)
{
    switch(type) ...
}
</code></pre>
<p>oder ein neuer Visitor, wobei mir das Visitor Pattern sehr schleierhaft ist, es wurde aber angepriesen und es ist wohl das beste wenn ich es verwende.<br />
Dazu werde ich aber später nochmal kommen denke ich.</p>
<p>Was meint ihr, wie ich meinem Bäumchen am besten ein paar edit-Möglichkeiten gebe?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/261969/baum-design</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 21:48:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/261969.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 26 Feb 2010 12:18:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Baum-Design on Fri, 26 Feb 2010 12:18:11 GMT]]></title><description><![CDATA[<p>Ich weiß leider keinen besseren Titel^^</p>
<p>Also im Grunde habe ich einen Baum, der prinzipielle Aufbau ist:<br />
(ich lasse hier fast alle details weg)</p>
<pre><code class="language-cpp">class Node
{
public:
    Node* parent;
    int type;
    virtual void acceptVisitor()=0;
};
class GNode : Node
{
    std::list&lt;Node*&gt; children;
}

class SNode : Node
{
    interessante Dinge ...
}
</code></pre>
<p>Das ganze läuft auf einen Szenengraphen hinaus,<br />
die Visitor werden Solche wie sucheKamera, renderer, ...</p>
<p>Ich möchte nun noch eine Möglichkeit hinzufügen, bestimmte Knoten zu finden und zu manipulieren (zB löschen)</p>
<p>Da ich die Möglichkeit brauche einen Knoten zu löschen, glaube ich dass<br />
etwas wie:</p>
<pre><code class="language-cpp">Node::deleteMe()
{
    parent = 0;
    delete this;
}
</code></pre>
<p>schwachsinn ist, zwar weiß ich dass es nur zeiger geben wird aber das muss jemand anderes ja nicht wissen, ausserdem behagt mir die vorstellung gar nicht, dass ein Knoten sich selbst löschen kann...<br />
Da bei allen verschiedenen Arten von Knoten etwas anderes getan werden müsste,<br />
bin ich grad etwas unschlüssig, wie ich das ganze angehen soll.</p>
<p>Spontan in den Sinn kamen mir:</p>
<p>eine statische Funktion</p>
<pre><code class="language-cpp">Node::deleteNode(Node*)
{
    switch(type) ...
}
</code></pre>
<p>oder ein neuer Visitor, wobei mir das Visitor Pattern sehr schleierhaft ist, es wurde aber angepriesen und es ist wohl das beste wenn ich es verwende.<br />
Dazu werde ich aber später nochmal kommen denke ich.</p>
<p>Was meint ihr, wie ich meinem Bäumchen am besten ein paar edit-Möglichkeiten gebe?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1861715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1861715</guid><dc:creator><![CDATA[shisha]]></dc:creator><pubDate>Fri, 26 Feb 2010 12:18:11 GMT</pubDate></item><item><title><![CDATA[Reply to Baum-Design on Fri, 26 Feb 2010 12:34:57 GMT]]></title><description><![CDATA[<p>Was ist das für ein Baum, bei dem der allgemeine Typ Node nur nen Zeiger auf sein parent hat, nicht aber auf seine children?!?<br />
Du hast ja irgendwo nen Node* root. Peng, wo sind meine children? Willst du dir dann irgendwo alle Blätter speichern? Komischer Baum <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="😉"
    /><br />
Dann ist es auch klar was du willst. Eine Methode &quot;Tree::removeNode(Node* node)&quot;, die sich das parent schnappt, die children von node an parent zuweist, vorher den children das neue parent verpasst. Damit ist node befreit und kann gelöscht werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1861721</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1861721</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Fri, 26 Feb 2010 12:34:57 GMT</pubDate></item><item><title><![CDATA[Reply to Baum-Design on Fri, 26 Feb 2010 12:52:53 GMT]]></title><description><![CDATA[<p>zum komischen baum:</p>
<p>nur GNodes können Kinder haben, Node* root wird immer vom Typ GNode sein, da Node ohnehin rein virtuell ist.</p>
<p>Aber wie ich deine Antwort jetzt verstanden habe sollte ich die Alternative mit der statischen Methode nehmen, oder?<br />
Dabei sollte ich aber noch beachten dass parent != 0 ist, da ich meine Kinder sonst in die Luft hänge ...</p>
<p>Hmm du hast die Vorgehensweise grad so schön erklärt, kannst du das auch für die von mir gewünschte Funktion</p>
<pre><code class="language-cpp">deleteSubtree(GNode* n)
{
    noch unklar....
}
</code></pre>
<p>Sinn und Zweck soll es sein einen Baum ab einem bestimmten Knoten rekursiv zu löschen.</p>
<p>meine Gedanken dazu:</p>
<p>Ich muss den Baum erstmal hinabsteigen... bis auf SNodes, oder LNodes, die können eh keine Kinder haben</p>
<pre><code class="language-cpp">std::list&lt;Node*&gt;::iterator iter;
for(iter = children.begin(); iter!= children.end(); iter++)
{
    Node* tmp = *iter;
    if(tmp-&gt;type == SNode)
    {
        delete SNode;
    }
    else( Node::deleteSubTree(tmp) );
}
</code></pre>
<p>stopp da geht was schief... so lösche ich nur die Snodes...<br />
falls du das so schön in worte fassen kannst wie das vorgehen sein sollte... wäre schön. Ich häng da irgendwo...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1861724</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1861724</guid><dc:creator><![CDATA[shisha]]></dc:creator><pubDate>Fri, 26 Feb 2010 12:52:53 GMT</pubDate></item><item><title><![CDATA[Reply to Baum-Design on Fri, 26 Feb 2010 13:05:38 GMT]]></title><description><![CDATA[<p>so nachdem ich mir das mal aufgemalt habe bin ich zu folgendem gekommen:</p>
<pre><code class="language-cpp">Node::removeSubtree(GNode* n)
{
    std::list&lt;Node*&gt;::iterator iter;
while(! list.empty())
{
    for(iter = children.begin(); iter!= children.end(); iter++)
    {
        Node* tmp = *iter;
        if(tmp-&gt;type == SNode)
        {
            delete SNode;
            iter = list.erase(iter);
        }
        else( Node::delete(tmp) );
    }
}
}
</code></pre>
<p>Ich hoffe das könnte hinhaun</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1861730</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1861730</guid><dc:creator><![CDATA[shisha]]></dc:creator><pubDate>Fri, 26 Feb 2010 13:05:38 GMT</pubDate></item><item><title><![CDATA[Reply to Baum-Design on Fri, 26 Feb 2010 14:23:56 GMT]]></title><description><![CDATA[<p>Mir scheint, es geht einfacher.</p>
<pre><code class="language-cpp">static Node::deleteSubtree(GNode* toDel)
{
    std::list&lt;Node*&gt;::iterator iter;
    for(iter = toDel-&gt;children.begin(); iter!= toDel-&gt;children.end(); iter++)
    {
        Node* tmp = *iter;
        if(tmp-&gt;type == SNode)
        {
            delete SNode;
        }
        else{
             removeSubtree(tmp);
        };
    }
    Node::delete(toDel);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1861759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1861759</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 26 Feb 2010 14:23:56 GMT</pubDate></item><item><title><![CDATA[Reply to Baum-Design on Fri, 26 Feb 2010 14:49:21 GMT]]></title><description><![CDATA[<p>ich habs mir mal kurz angeschaut, das sollte hinkommen, das prinzip hab ich mal auf schmierpapier probiert, sah gut aus,</p>
<p>das einzige.. ich</p>
<p>mach mir sorgen weil aus den listen nichts gelöscht wird...</p>
<p>Wenn nämlich delete(node*)</p>
<p>jetzt die kinder weitergeben will, was passiert dann?<br />
die liste ist nicht leer, aber der speicherbereich wurde doch schon freigegeben.</p>
<blockquote>
<p>Dann ist es auch klar was du willst. Eine Methode &quot;Tree::removeNode(Node* node)&quot;, die sich das parent schnappt, die children von node an parent zuweist, vorher den children das neue parent verpasst. Damit ist node befreit und kann gelöscht werden.</p>
</blockquote>
<p>Das Kinder weitergeben könnte Probleme machen, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1861771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1861771</guid><dc:creator><![CDATA[shisha]]></dc:creator><pubDate>Fri, 26 Feb 2010 14:49:21 GMT</pubDate></item><item><title><![CDATA[Reply to Baum-Design on Fri, 26 Feb 2010 15:01:01 GMT]]></title><description><![CDATA[<p>Wie wäre diese Kombi:</p>
<pre><code class="language-cpp">void
Node::removeNode(Node* rem) {
  while( !rem-&gt;children.empty() ) {
    Node* n = rem-&gt;children.pop_fron();
    n-&gt;parent = rem-&gt;parent;
  }
  // rem-&gt;children is empty
  delete rem;
}

void
Node::removeSubtree( Node* n ) {
  delete n;
}

Node::~Node() {
  while( !children.empty() ) {
    delete children.pop_back();
  }
}
</code></pre>
<p>delete node; macht die ganze node samt children platt.<br />
Können wir direkt für removeSubtree nehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1861776</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1861776</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Fri, 26 Feb 2010 15:01:01 GMT</pubDate></item><item><title><![CDATA[Reply to Baum-Design on Tue, 02 Mar 2010 09:41:33 GMT]]></title><description><![CDATA[<p>hmm die lösung hatte mir gefallen nur meckert er grad rum:</p>
<blockquote>
<p>error: type ‘void’ argument given to ‘delete’, expected pointer</p>
</blockquote>
<pre><code class="language-cpp">sg::GroupNode::~GroupNode()
{
    while( !children.empty() )
    {
        delete this-&gt;children.pop_back();
    }
}
</code></pre>
<p>ich kanns mir leider nicht ganz erklären,<br />
vlt hängst damit zusammen, dass children eine list vom virtuellen basistypen ist?</p>
<pre><code class="language-cpp">std::list&lt; Node* &gt; children
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1863160</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863160</guid><dc:creator><![CDATA[shisha]]></dc:creator><pubDate>Tue, 02 Mar 2010 09:41:33 GMT</pubDate></item><item><title><![CDATA[Reply to Baum-Design on Tue, 02 Mar 2010 09:51:04 GMT]]></title><description><![CDATA[<p>shisha schrieb:</p>
<blockquote>
<blockquote>
<p>error: type ‘void’ argument given to ‘delete’, expected pointer</p>
</blockquote>
<pre><code class="language-cpp">sg::GroupNode::~GroupNode()
{
    while( !children.empty() )
    {
        delete this-&gt;children.pop_back();
    }
}
</code></pre>
<p>ich kanns mir leider nicht ganz erklären,</p>
</blockquote>
<p>Was verstehst Du denn an der Fehlermeldung nicht? Steht doch klipp und klar da. Tipp: pop_back tut nicht genau das, was Du erwartest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863167</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 02 Mar 2010 09:51:04 GMT</pubDate></item><item><title><![CDATA[Reply to Baum-Design on Tue, 02 Mar 2010 09:54:20 GMT]]></title><description><![CDATA[<p>omg, danke.</p>
<p>ich frag mich zwar, wer entschieden hat dass pop void als rückgabetyp hat, aber so ist alles klar</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863170</guid><dc:creator><![CDATA[shisha]]></dc:creator><pubDate>Tue, 02 Mar 2010 09:54:20 GMT</pubDate></item><item><title><![CDATA[Reply to Baum-Design on Tue, 02 Mar 2010 09:55:31 GMT]]></title><description><![CDATA[<p>bevor ich noch mehr dummheiten anstelle:<br />
wenn ich delete weglasse, sollte ja alles klappen?</p>
<p>pop ruft den destruktor auf und hauts aus der liste raus?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863173</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863173</guid><dc:creator><![CDATA[shisha]]></dc:creator><pubDate>Tue, 02 Mar 2010 09:55:31 GMT</pubDate></item><item><title><![CDATA[Reply to Baum-Design on Tue, 02 Mar 2010 10:41:06 GMT]]></title><description><![CDATA[<p>shisha schrieb:</p>
<blockquote>
<p>ich frag mich zwar, wer entschieden hat dass pop void als rückgabetyp hat</p>
</blockquote>
<p>Da gibt es auch eine gute Begründung für. Ausnahme-Sicherheit. Wenn pop_back eine Kopie des Elements zurückgeben soll, dann müsste man es so machen:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
T my_pop_back(vector&lt;T&gt; &amp; vec)
{
  T ret = vec.back();
  vec.pop_back();
  return ret;
}
</code></pre>
<p>Hier kann aber nicht mehr die &quot;starke Garantie&quot; (<a href="http://www.gotw.ca/gotw/082.htm" rel="nofollow">strong guarantee</a>) gegeben werden. Bei der Rückgabe von ret muss eine Kopie erstellt werden, was fehlschlagen kann. my_pop_back leitet die Ausnahme weiter an den Aufrufer. Das Element ist dann aber verloren gegangen und auch nicht mehr im Vektor vorhanden.</p>
<p>shisha schrieb:</p>
<blockquote>
<p>bevor ich noch mehr dummheiten anstelle:<br />
wenn ich delete weglasse, sollte ja alles klappen?</p>
<p>pop ruft den destruktor auf und hauts aus der liste raus?!</p>
</blockquote>
<p>pop_back entfernt das letzte Element aus dem Vektor. Da Du einen Vektor aus Zeigern hast, passiert nichts weiter. Zeiger haben sozusagen Destruktoren, die nichts tun -- genauso wie jeder andere &quot;skalare Typ&quot; auch (int, double, ...). Wenn Du das, worauf der Zeiger zeigt, löschen willst, könntest Du das zB so machen:</p>
<pre><code class="language-cpp">template&lt;typename Pointee&gt;
void delete_pointees(vector&lt;Pointee*&gt; &amp; vop)
{
  while (!vop.empty()) {
    delete vop.back();
    vop.pop_back();
  }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1863195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863195</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 02 Mar 2010 10:41:06 GMT</pubDate></item></channel></rss>