<?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[Typenableitungen zurückverfolgen?]]></title><description><![CDATA[<p>Vorneweg bitte ich um Verzeihung für meinen naiven Ansatz, ich komme von Java, was mir nicht gut getan zu haben scheint.</p>
<p>Ich habe eine Reihe an Token die ich in einem vector aufreihen möchte. Sie haben alle die selbe Hauptklasse, sind aber davon abgeleitete Erweiterungen. Nun will ich sie beim Auslesen wieder in diese Ableitungen einklassieren, damit ich sie in das Format casten kann, nur scheint C++ aber alle Eigenschaften direkt aus der Hauptklasse zu lesen, also weiß ich nicht, wie ich das machen soll?</p>
<p>Hier ist mein bestehender Ansatz. Ich schätze mal, dass die ganze Struktur unintuitiv ist - wär dankbar für Verbesserungsvorschläge.</p>
<pre><code class="language-cpp">struct value {
	virtual ~value(){};
};
struct variable : value {
	method* parent;
	string name;
	value data;
};

//...

vector&lt;value&gt; tokens;

//...

if(typeid(tokens.back()).name() != &quot;variable&quot;) {
	variable name;
	name = *static_cast&lt;variable*&gt;(&amp;tokens.back());
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/206328/typenableitungen-zurückverfolgen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 10 Oct 2026 08:49:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/206328.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 23 Feb 2008 15:59:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Typenableitungen zurückverfolgen? on Sat, 23 Feb 2008 16:01:52 GMT]]></title><description><![CDATA[<p>Vorneweg bitte ich um Verzeihung für meinen naiven Ansatz, ich komme von Java, was mir nicht gut getan zu haben scheint.</p>
<p>Ich habe eine Reihe an Token die ich in einem vector aufreihen möchte. Sie haben alle die selbe Hauptklasse, sind aber davon abgeleitete Erweiterungen. Nun will ich sie beim Auslesen wieder in diese Ableitungen einklassieren, damit ich sie in das Format casten kann, nur scheint C++ aber alle Eigenschaften direkt aus der Hauptklasse zu lesen, also weiß ich nicht, wie ich das machen soll?</p>
<p>Hier ist mein bestehender Ansatz. Ich schätze mal, dass die ganze Struktur unintuitiv ist - wär dankbar für Verbesserungsvorschläge.</p>
<pre><code class="language-cpp">struct value {
	virtual ~value(){};
};
struct variable : value {
	method* parent;
	string name;
	value data;
};

//...

vector&lt;value&gt; tokens;

//...

if(typeid(tokens.back()).name() != &quot;variable&quot;) {
	variable name;
	name = *static_cast&lt;variable*&gt;(&amp;tokens.back());
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1461579</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1461579</guid><dc:creator><![CDATA[lyschoening]]></dc:creator><pubDate>Sat, 23 Feb 2008 16:01:52 GMT</pubDate></item><item><title><![CDATA[Reply to Typenableitungen zurückverfolgen? on Sat, 23 Feb 2008 16:07:34 GMT]]></title><description><![CDATA[<p>was typeid().name() genau zurück gibt ist undefiniert. Downcasts macht man per dynamic_cast:</p>
<pre><code class="language-cpp">if(variable*name = dynamic_cast&lt;variable*&gt;(tokens.back())) {
    ...
}
</code></pre>
<p>dynamic_cast gibt einen korrekten Zeiger zurück wenn es sich in der Tat um den geforderten Typ handelt oder 0 sonst.</p>
<p>dynamic_cast ist aber selten wirklich nötig. Versuch es lieber mit einem anderen Ansatz.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1461582</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1461582</guid><dc:creator><![CDATA[Ben04]]></dc:creator><pubDate>Sat, 23 Feb 2008 16:07:34 GMT</pubDate></item><item><title><![CDATA[Reply to Typenableitungen zurückverfolgen? on Sat, 23 Feb 2008 16:22:25 GMT]]></title><description><![CDATA[<p>Zur Zeit ist mein Problem auch, zwischen einer größeren Zahl an abgeleiteten Klassen auszusortieren. Das funktioniert aber irgendwie nicht, im Moment bleibt das Aussortieren stecken und behauptet, dass der Wert keiner der Typen angehört, die ich im Quellcode definiert hab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1461596</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1461596</guid><dc:creator><![CDATA[lyschoening]]></dc:creator><pubDate>Sat, 23 Feb 2008 16:22:25 GMT</pubDate></item><item><title><![CDATA[Reply to Typenableitungen zurückverfolgen? on Sat, 23 Feb 2008 19:20:34 GMT]]></title><description><![CDATA[<p>Sorry meine Kristalkugel ist defekt. Du wirst schon mit dem Code rausrücken müssen wenn du Hilfe erwartest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1461665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1461665</guid><dc:creator><![CDATA[Ben04]]></dc:creator><pubDate>Sat, 23 Feb 2008 19:20:34 GMT</pubDate></item><item><title><![CDATA[Reply to Typenableitungen zurückverfolgen? on Sat, 23 Feb 2008 19:38:39 GMT]]></title><description><![CDATA[<p>Steht ganz oben - ein paar mehr structs, ein paar else-ifs und du hast es alles. Mein Problem mit typeid in der vorherigen Loesung ist, das es immer ´value´ ausgibt - mit deiner Loesung krieg ich einfach immer false. Hier meine angepasste Version:</p>
<pre><code class="language-cpp">if(dynamic_cast&lt;variable*&gt;(&amp;tokens.back())) {
	cout &lt;&lt; &quot;type variable&quot;;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1461674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1461674</guid><dc:creator><![CDATA[lyschoening]]></dc:creator><pubDate>Sat, 23 Feb 2008 19:38:39 GMT</pubDate></item><item><title><![CDATA[Reply to Typenableitungen zurückverfolgen? on Sun, 24 Feb 2008 11:38:32 GMT]]></title><description><![CDATA[<p>Um mit dynamic_cast arbeiten zu können, benötigt man in C++ Zeiger bzw. Referenzen. Du speicherst aber Werte in deinem std::vector ab, d.h. es wird nur der Basisklassenanteil gespeichert.</p>
<p>Du mußt also folgendermaßen vorgehen:</p>
<pre><code class="language-cpp">vector&lt;value *&gt; tokens; // Zeiger auf value-Objekte

tokens.push_back(new variable()); // dyn. allozierter Speicher

if(dynamic_cast&lt;variable*&gt;(&amp;tokens.back())) // nun findet er auch ein Objekt vom Typ &quot;variable*&quot;
  cout &lt;&lt; &quot;type variable&quot;;

// Speicher wieder freigeben
for(size_t i=0; i&lt;tokens.size(); i++)
  delete tokens[i]; // wichtig ist hierbei der virtuelle Destruktor der Basisklasse 'value' (das hast du ja schon richtig gemacht gehabt -)
</code></pre>
<p>Alternativ kannst du auch sog. shared-pointer (z.B. in der boost-Bibliothek: boost::shared_ptr) benutzen (die sich dann selber um die Freigabe kümmern).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1461873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1461873</guid><dc:creator><![CDATA[~dynamic]]></dc:creator><pubDate>Sun, 24 Feb 2008 11:38:32 GMT</pubDate></item><item><title><![CDATA[Reply to Typenableitungen zurückverfolgen? on Sun, 24 Feb 2008 16:15:27 GMT]]></title><description><![CDATA[<p>Danke, das klappt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1462021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1462021</guid><dc:creator><![CDATA[lyschoening]]></dc:creator><pubDate>Sun, 24 Feb 2008 16:15:27 GMT</pubDate></item></channel></rss>