<?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[Eleganter Baum-Entwurf]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe ein kleines Problem. Ich möchte eine Baumstruktur erstellen.<br />
Diese ergibt sich aus meinen Objekten: ein A hat mehrere Bs, ein B hat<br />
mehrere Cs. Im Prinzip, wäre es sinnvoll, wenn man einfach Zeigerarrays<br />
auf die verbundenen Objekte anlegt (A hat ein B-Array usw.).<br />
Nun möchte ich aber in dem entstehenden Baum ein wenig rumforsten und<br />
traversieren, kopieren, umhängen...<br />
Da fehlt ein Elternzeiger - also rein damit: B zeig jetzt auch auf den<br />
Elternknoten A. Leider heißen die Funktionen in jeder Ebene anders: B hat<br />
ein A *getA() und ein C *getC(int i). Also habe ich mir gedacht, leite ich<br />
alle baumfähigen Klassen von TreeNode ab, damit ich einheitlich mit<br />
getParent() und mit getChild(int i) sprechen kann. Diese verweisen<br />
lediglich auf die &quot;Original-Funktionen&quot;.<br />
Was mich etwas stört, ist, daß getParent() und getChild() immer &quot;typlos&quot;<br />
daherkommen, und ich im Zweifelsfall erst ein A,B,C zurechtcasten muß.</p>
<p>So richtig glücklich bin ich damit noch nicht. Ich möchte diese Typlosigkeit<br />
besser verbergen. Kann mir vielleicht ein Iterator weiterhelfen?<br />
Der untenstehende Code ist nur so als Skizze gedacht. Das werden dann<br />
später sicher dynamische Arrays mit Smart-Pointern und Klasseninformationen<br />
(evtl. QT,Boost oder sowas). Die Bäume sollen serialisiert werden usw.</p>
<p>Ich wäre für Verbesserungsvorschläge/Kritik sehr dankbar.</p>
<p>Viele Grüße,<br />
Ulf</p>
<pre><code class="language-cpp">class TreeNode // Basisklasse von A,B und C
{
public:
	virtual TreeNode *getParent() = 0;          // wird durch 
	virtual TreeNode *getChild(int index) = 0;  // Zeiger auf Papa
};

class A : public TreeNode  // &quot;Wurzel&quot;
{
public:
	B *getB(int index) { return b_vector[index]; }
	TreeNode *getParent() { return NULL; }		// NULL, weil Wurzel
	TreeNode *getChild(int index) { return getB(index); } // weiterleiten
protected:
	vector&lt;B*&gt; b_vector; // children
};

class B : public TreeNode // &quot;mittlere Ebene&quot;
{
public:
	A *getA() { return a; } // parent
	C *getC(int index) { return c_vector[index]; } // children
	TreeNode *getParent() { return getA(); }			  // weiterleiten
	TreeNode *getChild(int index) { return getC(index); } // weiterleiten
protected:
	A* a;				 // parent
	vector&lt;C*&gt; c_vector; // children
};

class C : public TreeNode  // &quot;Blätter&quot;
{
	B *getB() { return b; } // parent
	TreeNode *getParent() { return getB(); }	 // weiterleiten
	TreeNode *getChild(int index) { return NULL; } // NULL, weil Blatt
protected:
	B* b; // parent
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/139363/eleganter-baum-entwurf</link><generator>RSS for Node</generator><lastBuildDate>Sun, 30 Aug 2026 13:24:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/139363.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 06 Mar 2006 09:07:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Eleganter Baum-Entwurf on Mon, 06 Mar 2006 09:07:57 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe ein kleines Problem. Ich möchte eine Baumstruktur erstellen.<br />
Diese ergibt sich aus meinen Objekten: ein A hat mehrere Bs, ein B hat<br />
mehrere Cs. Im Prinzip, wäre es sinnvoll, wenn man einfach Zeigerarrays<br />
auf die verbundenen Objekte anlegt (A hat ein B-Array usw.).<br />
Nun möchte ich aber in dem entstehenden Baum ein wenig rumforsten und<br />
traversieren, kopieren, umhängen...<br />
Da fehlt ein Elternzeiger - also rein damit: B zeig jetzt auch auf den<br />
Elternknoten A. Leider heißen die Funktionen in jeder Ebene anders: B hat<br />
ein A *getA() und ein C *getC(int i). Also habe ich mir gedacht, leite ich<br />
alle baumfähigen Klassen von TreeNode ab, damit ich einheitlich mit<br />
getParent() und mit getChild(int i) sprechen kann. Diese verweisen<br />
lediglich auf die &quot;Original-Funktionen&quot;.<br />
Was mich etwas stört, ist, daß getParent() und getChild() immer &quot;typlos&quot;<br />
daherkommen, und ich im Zweifelsfall erst ein A,B,C zurechtcasten muß.</p>
<p>So richtig glücklich bin ich damit noch nicht. Ich möchte diese Typlosigkeit<br />
besser verbergen. Kann mir vielleicht ein Iterator weiterhelfen?<br />
Der untenstehende Code ist nur so als Skizze gedacht. Das werden dann<br />
später sicher dynamische Arrays mit Smart-Pointern und Klasseninformationen<br />
(evtl. QT,Boost oder sowas). Die Bäume sollen serialisiert werden usw.</p>
<p>Ich wäre für Verbesserungsvorschläge/Kritik sehr dankbar.</p>
<p>Viele Grüße,<br />
Ulf</p>
<pre><code class="language-cpp">class TreeNode // Basisklasse von A,B und C
{
public:
	virtual TreeNode *getParent() = 0;          // wird durch 
	virtual TreeNode *getChild(int index) = 0;  // Zeiger auf Papa
};

class A : public TreeNode  // &quot;Wurzel&quot;
{
public:
	B *getB(int index) { return b_vector[index]; }
	TreeNode *getParent() { return NULL; }		// NULL, weil Wurzel
	TreeNode *getChild(int index) { return getB(index); } // weiterleiten
protected:
	vector&lt;B*&gt; b_vector; // children
};

class B : public TreeNode // &quot;mittlere Ebene&quot;
{
public:
	A *getA() { return a; } // parent
	C *getC(int index) { return c_vector[index]; } // children
	TreeNode *getParent() { return getA(); }			  // weiterleiten
	TreeNode *getChild(int index) { return getC(index); } // weiterleiten
protected:
	A* a;				 // parent
	vector&lt;C*&gt; c_vector; // children
};

class C : public TreeNode  // &quot;Blätter&quot;
{
	B *getB() { return b; } // parent
	TreeNode *getParent() { return getB(); }	 // weiterleiten
	TreeNode *getChild(int index) { return NULL; } // NULL, weil Blatt
protected:
	B* b; // parent
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1009462</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1009462</guid><dc:creator><![CDATA[stimpleton]]></dc:creator><pubDate>Mon, 06 Mar 2006 09:07:57 GMT</pubDate></item><item><title><![CDATA[Reply to Eleganter Baum-Entwurf on Mon, 06 Mar 2006 09:17:06 GMT]]></title><description><![CDATA[<p>So eine gemeinsame Basisklasse ist nur dann wirklich zu gebrauchen, wenn du die Objekte (Wurzel, Äste, Blätter) gleichartig behandeln willst - willst du das? Bei deiner dreischichtigen Struktur ist es wahrscheinlich sicherer, doch diekt mit den spezifischen Get.-Methoden zu arbeiten.</p>
<p>alternativ würde mir noch ein Einsatz mit Templates einfallen:</p>
<pre><code class="language-cpp">template&lt;typename p,typename c&gt; class node
{
public:
  virtual p* getParent() = 0;
  virtual c* getChild(int) = 0;
};

class A;
class B;
class C;

class A : public node&lt;void,B&gt;
{
public:
  void* getParant() {return 0;}
  B* getChild(int i) {return m_bs[i];}
private:
  vector&lt;B*&gt; m_bs;
};

class B : public node&lt;A,C&gt;
{...};

class C : public node&lt;B,void&gt;
{...};
</code></pre>
<p>(Achtung: ungetestet)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1009473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1009473</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 06 Mar 2006 09:17:06 GMT</pubDate></item><item><title><![CDATA[Reply to Eleganter Baum-Entwurf on Mon, 06 Mar 2006 11:07:50 GMT]]></title><description><![CDATA[<p>warum unterscheidest du die blätter im voraus in wurzel, knoten und blatt? was ist, wenn sich der baum ändert, dann müsstest du die entsprechenden elemente umbauen.</p>
<p>für nen baum reicht im grunde eine sehr einfache struktur</p>
<pre><code class="language-cpp">template&lt;typename Type&gt;
class Node
{
private:
 Type payload;
 Node *parent;
 std::vector&lt;Node*&gt; children;
public:
 // getter &amp; setter
}
</code></pre>
<p>die wurzel definiert sich dadurch, dass sie keinen parent hat, die blätter durch nicht vorhandene kinder.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1009571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1009571</guid><dc:creator><![CDATA[thordk]]></dc:creator><pubDate>Mon, 06 Mar 2006 11:07:50 GMT</pubDate></item><item><title><![CDATA[Reply to Eleganter Baum-Entwurf on Mon, 06 Mar 2006 11:34:11 GMT]]></title><description><![CDATA[<p>Das habe ich vielleicht etwas unglücklich dargestellt.</p>
<p>Der Baum im Beispiel hat nur drei Ebenen (Wurzel,&quot;Äste&quot;,Blätter).<br />
Im Prinzip darf der Baum beliebig viele Ebenen haben, auf jeder Ebene<br />
ist dann aber genau ein Typ.<br />
Es geht auch nicht um genau einen Baum. Es soll verschiedene Bäume<br />
mit dem gleichen Aufbau geben (1 Elternteil, viele Kinder).<br />
Leider gehen Templates nicht, da eben auf jeder Ebene ein anderer<br />
Typ vorhanden ist.<br />
Ein &quot;namentliches&quot; Ansprechen mit getA() scheitert an der Beliebigkeit<br />
der Bäume. Das muß bei allen Bäumen dieser Art etwa gleich gehen, damit<br />
man auf so einem Baum dann Standardfunktionen (einfügen, kopieren)<br />
definieren kann.<br />
Die Idee von thordk hatte ich auch schon: eine Art Container, der pro<br />
Knoten einen Verweis/Zeiger auf das eigentliche Datenobjekt beinhaltet.<br />
Da fand ich es günstiger, wenn A tatsächlich Zeiger auf B hat und nicht<br />
die Baumstruktur nur in den Nodes ist, die ihrerseits auf A und B zeigen.</p>
<p>Daher mein Entwurf...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1009589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1009589</guid><dc:creator><![CDATA[stimpleton]]></dc:creator><pubDate>Mon, 06 Mar 2006 11:34:11 GMT</pubDate></item><item><title><![CDATA[Reply to Eleganter Baum-Entwurf on Mon, 06 Mar 2006 14:11:47 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>das mit den Templates klingt interessant.<br />
Aber folgendes dürfte z.B. für eine Funktion getRoot() nicht gehen:</p>
<pre><code class="language-cpp">while(ptr!=NULL) ptr=ptr-&gt;getParent();
</code></pre>
<p>... dafür brauche ich die Gleichmacherei zur Baumverwaltung (oder?).<br />
Für die Datenverwaltung hätte ich lieber die Typsicherheit.</p>
<p>Daher kam ja meine Idee mit dem Iterator. Der darf gleichmachen und<br />
rumforsten. Der Benutzer braucht/darf das nicht. Aber ich weiß nicht,<br />
ob das geht...</p>
<p>Gruß,<br />
Ulf</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1009756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1009756</guid><dc:creator><![CDATA[stimpleton]]></dc:creator><pubDate>Mon, 06 Mar 2006 14:11:47 GMT</pubDate></item></channel></rss>