<?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[Feststellen, ob Typ des Objekt die Ableitung eines anderen ist]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgendes Problem habe ich:</p>
<p>Es muss zur Laufzeit festgestellt werden, ob ein Objekt eine Ableitung eines anderen Objektes ist.<br />
(Anmerkung: Das ist keine Verwechslung zwischen Klasse und Objekt)</p>
<p>Beispiel</p>
<pre><code class="language-cpp">class A {
virtual void dummy(void) {};  //braucht RTTI
};
class A1  : A {};
class A11 : A1 {};
class A2  : A {};

//Objekte davon erzeugen
A* a=    new A();
A* a1=   new A1();
A* a11=  new A11(); 
A* a2=   new A2();

//Und nun sollte der Verlgeich kommen
if ( ableitung_von(a, a1) )   ---&gt; true
if ( ableitung_von(a, a11) )  ---&gt; true
if ( ableitung_von(a2, a11) ) ---&gt; false
</code></pre>
<p>Habt ihr vielleicht eine Idee, wie ich die Funktion ableitung_von() implementieren koennte?</p>
<p>Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/129278/feststellen-ob-typ-des-objekt-die-ableitung-eines-anderen-ist</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 04:22:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/129278.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 12 Dec 2005 10:36:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Feststellen, ob Typ des Objekt die Ableitung eines anderen ist on Mon, 12 Dec 2005 10:36:52 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgendes Problem habe ich:</p>
<p>Es muss zur Laufzeit festgestellt werden, ob ein Objekt eine Ableitung eines anderen Objektes ist.<br />
(Anmerkung: Das ist keine Verwechslung zwischen Klasse und Objekt)</p>
<p>Beispiel</p>
<pre><code class="language-cpp">class A {
virtual void dummy(void) {};  //braucht RTTI
};
class A1  : A {};
class A11 : A1 {};
class A2  : A {};

//Objekte davon erzeugen
A* a=    new A();
A* a1=   new A1();
A* a11=  new A11(); 
A* a2=   new A2();

//Und nun sollte der Verlgeich kommen
if ( ableitung_von(a, a1) )   ---&gt; true
if ( ableitung_von(a, a11) )  ---&gt; true
if ( ableitung_von(a2, a11) ) ---&gt; false
</code></pre>
<p>Habt ihr vielleicht eine Idee, wie ich die Funktion ableitung_von() implementieren koennte?</p>
<p>Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/940036</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/940036</guid><dc:creator><![CDATA[markus.r]]></dc:creator><pubDate>Mon, 12 Dec 2005 10:36:52 GMT</pubDate></item><item><title><![CDATA[Reply to Feststellen, ob Typ des Objekt die Ableitung eines anderen ist on Mon, 12 Dec 2005 10:44:06 GMT]]></title><description><![CDATA[<p>dynamic_cast</p>
]]></description><link>https://www.c-plusplus.net/forum/post/940040</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/940040</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Mon, 12 Dec 2005 10:44:06 GMT</pubDate></item><item><title><![CDATA[Reply to Feststellen, ob Typ des Objekt die Ableitung eines anderen ist on Mon, 12 Dec 2005 10:50:30 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;typeinfo&gt;

...
if (typeid(A).before( typeid(*a1) )) // true
if (typeid(A).before( typeid(*a11) )) // true
if (typeid(A2).before( typeid(*a11) )) // false

/* Für A selbst */
if (typeid(A) == typeid(*a)) // true
</code></pre>
<p>So gehts. Ob das empfohlen ist, das so zu machen, würd mich jetzt selbst mal interessieren <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/940045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/940045</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 12 Dec 2005 10:50:30 GMT</pubDate></item><item><title><![CDATA[Reply to Feststellen, ob Typ des Objekt die Ableitung eines anderen ist on Mon, 12 Dec 2005 11:15:26 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10648">@LordJaxom</a>: Ich möchte meinen, dass das nicht definiert ist, da before nur eine totale Ordnung alle möglichen Typen bereitstellt, die aber nichts mit ihrer Vererbungshierarchie zutun haben muss.</p>
<p>dynamic_cast ist schon die richtige Lösung für die Problemstellung.</p>
<p>C++-Standard 18.5.1 Cl. 4:<br />
bool before(const type_info&amp; rhs) const;<br />
5 Effects: Compares the current object with rhs.<br />
6 Returns: true if *this precedes rhs in the implementations collation order.</p>
<p>Wobei &quot;implementations collation order&quot; keine Aussage über die Typ-Beziehungen macht. before kann auch true liefern für Typen, die in keinerlei Beziehung zueinander stehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/940060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/940060</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Mon, 12 Dec 2005 11:15:26 GMT</pubDate></item><item><title><![CDATA[Reply to Feststellen, ob Typ des Objekt die Ableitung eines anderen ist on Mon, 12 Dec 2005 11:10:51 GMT]]></title><description><![CDATA[<p>Danke zunächst mal.</p>
<p>An dynamic_cast dachte ich auch schon, aber damit kann ich nach meinem Wissen keine zwei Objekte vergleichen:</p>
<p>die normale Anwendung ist:</p>
<pre><code class="language-cpp">dynamic_cast&lt;A1*&gt;(a1)   --&gt; true
dynamic_cast&lt;A1*&gt;(a11)  --&gt; true
dynamic_cast&lt;A1*&gt;(a2)   --&gt; false
</code></pre>
<p>Problematisch ist aber hierbei, dass ich so damit nur ein Objekt gegen einen zur Compilezeit festgelegten Typ testen kann und nicht zwei Objekte zur Laufzeit.</p>
<p>Wie würdet ihr das machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/940062</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/940062</guid><dc:creator><![CDATA[markus.r]]></dc:creator><pubDate>Mon, 12 Dec 2005 11:10:51 GMT</pubDate></item><item><title><![CDATA[Reply to Feststellen, ob Typ des Objekt die Ableitung eines anderen ist on Mon, 12 Dec 2005 11:14:17 GMT]]></title><description><![CDATA[<p>Ohne mir jetzt Gedanken über die Machbarkeit gemacht zu haben: Wozu brauchst du das? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> Das klingt eher nach einem schlechten Design.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/940066</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/940066</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Mon, 12 Dec 2005 11:14:17 GMT</pubDate></item><item><title><![CDATA[Reply to Feststellen, ob Typ des Objekt die Ableitung eines anderen ist on Mon, 12 Dec 2005 11:19:41 GMT]]></title><description><![CDATA[<p>wenn du 2 Objekte hast und testen willst, ob sie zur selben Klasse gehören, wirst wohl RTTI benutzen müssen, da kommst an die Klassennamen ran. Aber komisch klingt das schon, was du willst. Lässt sich das nicht umgehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/940069</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/940069</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Mon, 12 Dec 2005 11:19:41 GMT</pubDate></item><item><title><![CDATA[Reply to Feststellen, ob Typ des Objekt die Ableitung eines anderen ist on Mon, 12 Dec 2005 12:18:36 GMT]]></title><description><![CDATA[<p>Es geht ja nicht darum festzustellen, ob zwei Objekte die selbe Most-Derived-Class haben (was auch unschön ist, sich aber über den Vergleich von type_infos machen lässt), sondern welches von den beiden &quot;more derived&quot; ist (was imho nicht sinnvoll ist bzw. ein Missverständnis/Missbrauch von OOP - deshalb interessiere ich mich für die Absicht des OP). Ich möchte meinen dass das mit den Standardmitteln der C++ Sprache nicht möglich ist, da sie keinen Laufzeitmechanismus bereitstellt, um über die Vererbungshierarchie zu iterieren. Wenn das wirklich sein muss (was ich bezweifle), muss man sich das wohl händisch stricken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/940097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/940097</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Mon, 12 Dec 2005 12:18:36 GMT</pubDate></item><item><title><![CDATA[Reply to Feststellen, ob Typ des Objekt die Ableitung eines anderen ist on Mon, 12 Dec 2005 12:26:33 GMT]]></title><description><![CDATA[<p>markus.r schrieb:</p>
<blockquote>
<p>Problematisch ist aber hierbei, dass ich so damit nur ein Objekt gegen einen zur Compilezeit festgelegten Typ testen kann und nicht zwei Objekte zur Laufzeit.</p>
</blockquote>
<p>dynamic_cast prüft zur Laufzeit, nicht zur Compilezeit, deswegen <strong>dynamic</strong>_cast. <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>Also dein Bsp oben kriegst du ja locker hin damit.</p>
<p>Wenn du dagegen das willst, was 7H3 N4C3R im Post vor mir geschrieben hat, also feststellen welche mehr abgeleitet ist oder solche Späße. da bringt das natürlich nix.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/940109</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/940109</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Mon, 12 Dec 2005 12:26:33 GMT</pubDate></item><item><title><![CDATA[Reply to Feststellen, ob Typ des Objekt die Ableitung eines anderen ist on Mon, 12 Dec 2005 12:29:11 GMT]]></title><description><![CDATA[<p>Danke erstmal.</p>
<p>dann komme ich wohl um folgendes Konstrukt nicht herum:</p>
<pre><code>if ( (dynamic_cast&lt;A*&gt;(p_objekt1)) &amp;&amp; (dynamic_cast&lt;A*&gt;(p_objekt2) ) return true
else if ( (dynamic_cast&lt;A1*&gt;(p_objekt1)) &amp;&amp; (dynamic_cast&lt;A1*&gt;(p_objekt2) ) return true
else if ( (dynamic_cast&lt;B*&gt;(p_objekt1)) &amp;&amp; (dynamic_cast&lt;B*&gt;(p_objekt2) ) return true
//..
return false;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/940113</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/940113</guid><dc:creator><![CDATA[markus.r]]></dc:creator><pubDate>Mon, 12 Dec 2005 12:29:11 GMT</pubDate></item><item><title><![CDATA[Reply to Feststellen, ob Typ des Objekt die Ableitung eines anderen ist on Mon, 12 Dec 2005 12:35:34 GMT]]></title><description><![CDATA[<p>[quote=&quot;Pellaeon&quot;]</p>
<p>markus.r schrieb:</p>
<blockquote>
<p>dynamic_cast prüft zur Laufzeit, nicht zur Compilezeit, [..] <strong>dynamic</strong>_cast. <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>
</blockquote>
<pre><code>dynamic_cast&lt;Argument1&gt;(Argument2);
</code></pre>
<p>Zur Laufzeit ist lediglioch Argument2 variabel, Argument1 muss zur Compilezeit statisch festgelegt werden.</p>
<p>In meinem Fall muss ich jedoch zwei Objekte vergleichen, deren Typen zur Laufzeit erst feststehen.<br />
Also ich möchte wissen, ob die beiden Typen der Objekte einen gemeinsamen Vorgänger in der Vererbungshierarchie haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/940127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/940127</guid><dc:creator><![CDATA[markus.r]]></dc:creator><pubDate>Mon, 12 Dec 2005 12:35:34 GMT</pubDate></item><item><title><![CDATA[Reply to Feststellen, ob Typ des Objekt die Ableitung eines anderen ist on Mon, 12 Dec 2005 12:44:52 GMT]]></title><description><![CDATA[<p>Diese Lösung ist nicht nur &quot;unästhetisch&quot;, sondern bricht auf mit objektorientierten Prinzipien. Sie ist kaum wartbar, da jede Veränderung in der Vererbungshierarchie quasi ein Neustricken der Funktion bedeutet. Ohne mir intensiv Gedanken gemacht zu haben würde ich sagen, hat eine Funktion dieser Art exponenzielle Komplexität - sowohl bei Auswerten als auch beim Ausprogrammieren. Absoluter Overkill.</p>
<p>Sofern du Ratschläge oder alternative sauberere Lösungen suchst, erklär uns doch bitte mal das Problem und was du vorhast.</p>
<p>Die Ironie an deinem zuletzt geposteten Code ist übrigens, dass du alle Typen statisch benannt hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/940129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/940129</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Mon, 12 Dec 2005 12:44:52 GMT</pubDate></item><item><title><![CDATA[Reply to Feststellen, ob Typ des Objekt die Ableitung eines anderen ist on Mon, 12 Dec 2005 12:42:24 GMT]]></title><description><![CDATA[<p>Schreib doch mal, was du gerade genau programmieren willst, dann kann man dir mehr helfen. Das was du da programmieren willst, ist nicht wirklich eine Option^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/940135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/940135</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Mon, 12 Dec 2005 12:42:24 GMT</pubDate></item><item><title><![CDATA[Reply to Feststellen, ob Typ des Objekt die Ableitung eines anderen ist on Mon, 12 Dec 2005 12:46:30 GMT]]></title><description><![CDATA[<p>7H3 N4C3R:<br />
Richtig, daher fragte ich auch, denn auf die schlechte Lösung mit den dynamic_cast bin ich selbst schon gekommen.</p>
<p>Das Problem lässt sich wie folgt umreissen.</p>
<p>Es gibt verschiedene STL-Listen, welche Pointer auf verschiedene Objekte-Arten beinhalten können.<br />
Hier ein Beispiel mit den Klassen von oben:</p>
<pre><code class="language-cpp">list&lt;A*&gt; liste_a;  
//gefuellt mit Pointer auf Objekte vom Typ A, A1, A2 und A11

list&lt;A1*&gt; liste_a1;
//gefuellt mit Pointer auf Objekten vom Typ A1 und A11

list&lt;B*&gt; liste_b;
//gefuellt mit Pointer auf Objekte vom Typ B1 usw.
</code></pre>
<p>Objekte sollen nun zwischen den Listen wahlfrei verschoben werden können, wenn das der Typ zulässt.</p>
<p>Die anderen Probleme, die hier auftreten, lassen wir mal aussen vor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/940139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/940139</guid><dc:creator><![CDATA[markus.r]]></dc:creator><pubDate>Mon, 12 Dec 2005 12:46:30 GMT</pubDate></item><item><title><![CDATA[Reply to Feststellen, ob Typ des Objekt die Ableitung eines anderen ist on Mon, 12 Dec 2005 12:57:07 GMT]]></title><description><![CDATA[<p>da würde doch jeweils ein cast reichen oder?<br />
testen ob der neue Zeiger zum Zeigertyp der Liste passt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/940150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/940150</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Mon, 12 Dec 2005 12:57:07 GMT</pubDate></item><item><title><![CDATA[Reply to Feststellen, ob Typ des Objekt die Ableitung eines anderen ist on Mon, 12 Dec 2005 13:00:29 GMT]]></title><description><![CDATA[<p>Bisher haben alle Deine Beispiele die Eigenschaft dass es nur eine Basisklasse (A) gibt. D.h. es macht IMHO bisher keinen Sinn etwas anderes als nur eine list&lt;A*&gt; zu halten (oder?).</p>
<p>Ansonsten, wenn Du eine list&lt;A1*&gt; haben musst, weisst Du selbst doch schon dass jedes Element dieser Liste von A abgeleitet ist, und demnach dynamic_cast auch garantiert nicht NULL liefern wird.</p>
<p>Irgendwie hab ich die Ahnung, dass das eigentlich einfacher gehen muss <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=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/940152</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/940152</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 12 Dec 2005 13:00:29 GMT</pubDate></item><item><title><![CDATA[Reply to Feststellen, ob Typ des Objekt die Ableitung eines anderen ist on Mon, 12 Dec 2005 13:03:40 GMT]]></title><description><![CDATA[<p>:xmas2:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/940159</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/940159</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Mon, 12 Dec 2005 13:03:40 GMT</pubDate></item><item><title><![CDATA[Reply to Feststellen, ob Typ des Objekt die Ableitung eines anderen ist on Mon, 12 Dec 2005 13:04:08 GMT]]></title><description><![CDATA[<p>Pellaeon schrieb:</p>
<blockquote>
<p>da würde doch jeweils ein cast reichen oder?<br />
testen ob der neue Zeiger zum Zeigertyp der Liste passt.</p>
</blockquote>
<p>So wie ich das sehe nicht. Anscheinend gibt es Ableitungen von T, die aber im Verhalten nicht mehr kompatibel mit T sind (und deshalb in einem Vektor XY unerwünscht). Das ist aber wiederum ein Bruch mit dem Liskov-Substitution-Principle.</p>
<p>Die Problembeschreibung klingt ein wenig nach einem GUI mit Baumansicht, in der Drag and Drop möglich sein soll - nur eben nicht überall hin. Eine Möglichkeit wäre vielleicht, die Typanforderungen der Vektoren zu erhöhen. Sprich z.B. Vektoren mit Zeigern auf B zu halten, wo auch nur Bs reinsollen. Ein Vektor mit Zeigern auf Bs kann dann immernoch in einen Vektor von Zeigern auf As kopiert werden, sofern B von A abgeleitet ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/940160</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/940160</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Mon, 12 Dec 2005 13:04:08 GMT</pubDate></item><item><title><![CDATA[Reply to Feststellen, ob Typ des Objekt die Ableitung eines anderen ist on Mon, 12 Dec 2005 13:08:07 GMT]]></title><description><![CDATA[<p>Da C++ eine Compilersprache und keine Laufzeitsprache ist, werde ich wohl in den sauren Apfel beissen müssen.</p>
<p>Eine ähnliche Idee habe ich damals übrigens verworfen, dass alle Klassen von der gleichen Urklasse abgeleitet sind und ich in den Listen quasi nur Pointer auf die Urklasse halte.</p>
<p>Die sonderbare Listenbildung hat übrigens einen fachlichen Grund.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/940163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/940163</guid><dc:creator><![CDATA[markus.r]]></dc:creator><pubDate>Mon, 12 Dec 2005 13:08:07 GMT</pubDate></item><item><title><![CDATA[Reply to Feststellen, ob Typ des Objekt die Ableitung eines anderen ist on Mon, 12 Dec 2005 13:16:54 GMT]]></title><description><![CDATA[<p>markus.r schrieb:</p>
<blockquote>
<pre><code class="language-cpp">list&lt;A*&gt; liste_a;  
//gefuellt mit Pointer auf Objekte vom Typ A, A1, A2 und A11

list&lt;A1*&gt; liste_a1;
//gefuellt mit Pointer auf Objekten vom Typ A1 und A11

list&lt;B*&gt; liste_b;
//gefuellt mit Pointer auf Objekte vom Typ B1 usw.
</code></pre>
<p>Objekte sollen nun zwischen den Listen wahlfrei verschoben werden können, wenn das der Typ zulässt.</p>
</blockquote>
<p>liste_a und liste_a1 in liste_b würde gar net gehen, Compilefehler, esseidenn du würdest wie wild casten, was du ja nicht machst.</p>
<p>liste_a1 nach liste_a klappt auch ohne Probs. liste_b in eine liste_a* würde auch net kompilieren, also bleibt doch nur liste_a nach liste_a1. Und da würd ein dynamic_cast helfen.<br />
Insofern halt wirklich nur die Typen ausschlaggebend sind und nichts anderes</p>
<p>edit: ich seh grad ich vergaß die Basisklasse die alle gemein haben^^<br />
Aber dynamic_cast müsste gehen, insofern man an der Struktur mit den Listen nichts ändern kann</p>
]]></description><link>https://www.c-plusplus.net/forum/post/940175</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/940175</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Mon, 12 Dec 2005 13:16:54 GMT</pubDate></item><item><title><![CDATA[Reply to Feststellen, ob Typ des Objekt die Ableitung eines anderen ist on Mon, 12 Dec 2005 13:21:41 GMT]]></title><description><![CDATA[<p>7H3 N4C3R schrieb:</p>
<blockquote>
<p>Das ist aber wiederum ein Bruch mit dem Liskov-Substitution-Principle.</p>
</blockquote>
<p>Wenn ich das richtig verstanden habe, dass das &quot;Liskov-Substitution-Principle&quot; auch als &quot;ist-ein&quot;-Regel bekannt ist, dann stimme ich zu, dass ich die Klasse B etwas voreilig in das Beispiel eingefuehrt.<br />
In dem realen Projekt ist das selbstverstaendlich nicht der Fall.</p>
<p>Ich veranschauliche das Problem mal anders.<br />
Es geht hier um das Sortieren von Autos.</p>
<pre><code class="language-cpp">class Fahrzeug {};
class Sportwagen : Fahrzeug {};
class Porsche : Sportwagen {};
class Ferrari : Sportwagen {};
class Traktor : Fahrzeug {};

//und nun die Listen
list&lt;Fahrzeug*&gt; parkplatz;
list&lt;Sportwagen*&gt; parkplatz_golfplatz;
list&lt;Porsche*&gt; prosche_haendler;
list&lt;Traktor*&gt; acker;
</code></pre>
<p>7H3 N4C3R schrieb:</p>
<blockquote>
<p>Die Problembeschreibung klingt ein wenig nach einem GUI mit Baumansicht, in der Drag and Drop möglich sein soll</p>
</blockquote>
<p>Exakt das ist eine Teilanwendung davon, sehr gut &quot;hellgesehen&quot;:-)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/940185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/940185</guid><dc:creator><![CDATA[markus.r]]></dc:creator><pubDate>Mon, 12 Dec 2005 13:21:41 GMT</pubDate></item><item><title><![CDATA[Reply to Feststellen, ob Typ des Objekt die Ableitung eines anderen ist on Mon, 12 Dec 2005 13:46:04 GMT]]></title><description><![CDATA[<p>Beim LSP (oder ganz grundsätzlich bei öffentlicher Vererbung) geht das &quot;ist ein&quot; gleichher mit &quot;verhält sich wie ein&quot;.</p>
<p>Deine GUI könntest du als ein Kompositum darstellen. Wenn etwas in einen Knoten eingefügt werden soll, wir von diesem eine virtuelle accept( T*) Methode aufgerufen. Je nach Knotenklasse entscheidet diese, ob sie das übergebene Objekt akzeptiert oder ob es abwiesen wird.</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">class Base
{
public:
  virtual void accept( Base*) = 0; 
};

class A : public Base
{
public:
  virtual void accept( Base* b)
  {
    if( !dynamic_cast&lt;A*&gt;(b)) {
      throw std::runtime_error( &quot;Du kommst hier net rein.&quot;);
    }
  }
};
</code></pre>
<p>So musst du nur noch jeder Knotenklasse beibrigen, was sie akzeptiert und was nicht. Allerdings wird es wieder schwieriger mit der Listenbildung, da du dir im Baum jetzt erstmal alle Blätter suchen musst und daraus dann die Liste formen. Und natürlich kann jeder Knoten selbst entweder ein Blatt oder eine Liste sein. Das bringt ein Kompositum nunmal so mit sich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/940222</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/940222</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Mon, 12 Dec 2005 13:46:04 GMT</pubDate></item><item><title><![CDATA[Reply to Feststellen, ob Typ des Objekt die Ableitung eines anderen ist on Mon, 12 Dec 2005 13:57:30 GMT]]></title><description><![CDATA[<p>Eigentlich ist diese Idee nicht so kompliziert bei mir umzusetzen, da die Knoten in der Baumansicht sich lediglich auf das echte davon völlig unabhaengige Datenmodell referenzieren.</p>
<p>Der Angleich wird über eine Controller-View-Modell-Implementierung vollzogen.<br />
Die Baumsicht ist nur eine von diversen Views auf das Modell.<br />
Das Modell habe ich bisher so passiv wie moeglich gehalten aus verschiedenen Gruenden. D.h. es werden bisher Operationen auf das Modell, welche im Wesentlichen STL-Operationen sind, nicht nochmal gekapselt, da diese (zumindest) zur Compile-Zeit typsicherheit komfrortabel sicherstellen.</p>
<p>Vielleicht muss ich diesen Ansatz überdenken.</p>
<p>PS: Vielen dank für die freudliche und hochwertige Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/940244</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/940244</guid><dc:creator><![CDATA[markus.r]]></dc:creator><pubDate>Mon, 12 Dec 2005 13:57:30 GMT</pubDate></item></channel></rss>