<?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[[Anfänger] Funktionen dynamisch aufrufen?]]></title><description><![CDATA[<p>Hallo,<br />
ich möchte für mein kleines Text-RPG ein bißchen &quot;KI&quot; programmieren. Dazu würde ich die Aktionen, die die Gegner ausführen können &amp; sollen, gerne in seperate Funktionen packen:</p>
<pre><code class="language-cpp">void GruenerDracheTaktik()
{
    blabla
}
void OgerTaktik()
{
    blabla
}
void OrkTaktik()
{
    blabla
}
...
</code></pre>
<p>Aber, wie rufe ich diese nun mit möglichst wenig Aufwand auf? Ich habe meine Gegner in einem Vector stecken und muss nun dementsprechend die jeweilige KI aufrufen. Ich möchte ungern:</p>
<pre><code class="language-cpp">vector&lt;int&gt;::iterator j;
for ( i = GegnerV.begin(); i != GegnerV.end(); i++){

if(i-&gt;name == &quot;gruenerdrache&quot;){
GruenerDracheTaktik()
}
if(i-&gt;name == &quot;oger&quot;){
OgerTaktik()
}
if(i-&gt;name == &quot;ork&quot;){
OrkTaktik()
}
... usw. usf. ...
</code></pre>
<p>Wie löse ich das Problem? Ich könnte natürlich auch mit einem switch/case arbeiten, aber selbst das ist ziemlich viel Schreibaufwand bei später mal mehr als XXX Gegnertypen.<br />
Was gibts noch für Möglichkeiten? Kann ich vielleicht irgendwie einen dynamischen Funktionsaufruf bauen?</p>
<pre><code class="language-cpp">string Funktionsaufruf = i-&gt;name;
Funktionsaufruf();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/293358/anfänger-funktionen-dynamisch-aufrufen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 16 Aug 2026 08:16:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/293358.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 01 Oct 2011 12:19:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [Anfänger] Funktionen dynamisch aufrufen? on Sat, 01 Oct 2011 12:19:18 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich möchte für mein kleines Text-RPG ein bißchen &quot;KI&quot; programmieren. Dazu würde ich die Aktionen, die die Gegner ausführen können &amp; sollen, gerne in seperate Funktionen packen:</p>
<pre><code class="language-cpp">void GruenerDracheTaktik()
{
    blabla
}
void OgerTaktik()
{
    blabla
}
void OrkTaktik()
{
    blabla
}
...
</code></pre>
<p>Aber, wie rufe ich diese nun mit möglichst wenig Aufwand auf? Ich habe meine Gegner in einem Vector stecken und muss nun dementsprechend die jeweilige KI aufrufen. Ich möchte ungern:</p>
<pre><code class="language-cpp">vector&lt;int&gt;::iterator j;
for ( i = GegnerV.begin(); i != GegnerV.end(); i++){

if(i-&gt;name == &quot;gruenerdrache&quot;){
GruenerDracheTaktik()
}
if(i-&gt;name == &quot;oger&quot;){
OgerTaktik()
}
if(i-&gt;name == &quot;ork&quot;){
OrkTaktik()
}
... usw. usf. ...
</code></pre>
<p>Wie löse ich das Problem? Ich könnte natürlich auch mit einem switch/case arbeiten, aber selbst das ist ziemlich viel Schreibaufwand bei später mal mehr als XXX Gegnertypen.<br />
Was gibts noch für Möglichkeiten? Kann ich vielleicht irgendwie einen dynamischen Funktionsaufruf bauen?</p>
<pre><code class="language-cpp">string Funktionsaufruf = i-&gt;name;
Funktionsaufruf();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2125808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125808</guid><dc:creator><![CDATA[thuering]]></dc:creator><pubDate>Sat, 01 Oct 2011 12:19:18 GMT</pubDate></item><item><title><![CDATA[Reply to [Anfänger] Funktionen dynamisch aufrufen? on Sat, 01 Oct 2011 12:28:03 GMT]]></title><description><![CDATA[<p>indem du objektorientierung lernst zusammen mit polymorphie und deine gegnertypen als klassen schreibst die von einer basisklasse gegner erbt und eine taktik-methode oder was bereitstellt die überschrieben werden kann/muss</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125813</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125813</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sat, 01 Oct 2011 12:28:03 GMT</pubDate></item><item><title><![CDATA[Reply to [Anfänger] Funktionen dynamisch aufrufen? on Sat, 01 Oct 2011 12:46:37 GMT]]></title><description><![CDATA[<p>Absolut richtig! So wirds gemacht <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><em>Ich kann ja schon Objektorientierung. Ein bißchen. Ich denke nur nicht immer daran, was mir das alles bringt... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125819</guid><dc:creator><![CDATA[thuering]]></dc:creator><pubDate>Sat, 01 Oct 2011 12:46:37 GMT</pubDate></item><item><title><![CDATA[Reply to [Anfänger] Funktionen dynamisch aufrufen? on Sun, 02 Oct 2011 09:15:53 GMT]]></title><description><![CDATA[<p>Was ist gegen den Gebrauch einer Map mit Funktionalen zu sagen? Ich fände das eine sehr einfache Möglichkeit, wenn auch etwas dirty, da hier die Polymorphie/OOP nicht sehr ausgenutzt wird...</p>
<pre><code class="language-cpp">std::map&lt;std::string, std::function&lt;void(void)&gt;&gt; m_mTactics;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2126094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2126094</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 02 Oct 2011 09:15:53 GMT</pubDate></item><item><title><![CDATA[Reply to [Anfänger] Funktionen dynamisch aufrufen? on Sun, 02 Oct 2011 09:19:27 GMT]]></title><description><![CDATA[<p>Object Orientierung ist kein Muss. Die Map-Variante ist auch eine gute Möglichkeit! Es führen viele Wege nach Rom.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2126097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2126097</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Sun, 02 Oct 2011 09:19:27 GMT</pubDate></item><item><title><![CDATA[Reply to [Anfänger] Funktionen dynamisch aufrufen? on Sun, 02 Oct 2011 09:22:00 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/1463">@Artchi</a>: Könnte man nicht, um &quot;etwas OOP&quot; zu bewahren (xD) die Funktionale per <code>std::bind</code> an ein Objekt binden? Aber das wäre eh wieder nur irgendein Gefrickel <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2126099</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2126099</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 02 Oct 2011 09:22:00 GMT</pubDate></item><item><title><![CDATA[Reply to [Anfänger] Funktionen dynamisch aufrufen? on Sun, 02 Oct 2011 09:35:34 GMT]]></title><description><![CDATA[<p>Natürlich bringt Objektorientierung nicht immer was. Aber das hier ist eigentlich ein ziemlich typischer Fall, bei dem OOP angebracht ist. Wie schon gesagt kannst Du eine Basisklasse Monster machen, da die Methode Taktik aufrufen und in den Unterklassen kannst Du dann definieren, was Taktik eigentlich ist. Da brauchst Du keinen inperformanten Vergleich über den Namen mehr, das wird alles intern automatisch gemacht.</p>
<p>Stichwort wurde auch schon genannt: Polymorphie.</p>
<p>Und je nachdem, wie aufwendig diese Taktik ist, bietet es sich dann auch, die Taktiken in eigene Klassen auszulagern, um sie für unterschiedliche Gegner wiederzuverwenden usw. usf. Das bietet später einen hohen Grad von Wiederverwendbarkeit an und ist, wenn man den Durchblick hat, auch sehr gut wartbar. Dafür wurde OOP gemacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2126102</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2126102</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sun, 02 Oct 2011 09:35:34 GMT</pubDate></item><item><title><![CDATA[Reply to [Anfänger] Funktionen dynamisch aufrufen? on Sun, 02 Oct 2011 10:09:36 GMT]]></title><description><![CDATA[<p>Was genau ist an der Map-Variante nicht objektorientiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2126119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2126119</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 02 Oct 2011 10:09:36 GMT</pubDate></item><item><title><![CDATA[Reply to [Anfänger] Funktionen dynamisch aufrufen? on Sun, 02 Oct 2011 11:54:01 GMT]]></title><description><![CDATA[<p>naja man bindet eine globale funktion an ein beliebiges string objekt. ok, map ist OOP und string auch aber der ansatz schreit ja schon nach polymorphie...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2126171</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2126171</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sun, 02 Oct 2011 11:54:01 GMT</pubDate></item><item><title><![CDATA[Reply to [Anfänger] Funktionen dynamisch aufrufen? on Sun, 02 Oct 2011 12:10:29 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>naja man bindet eine globale funktion an ein beliebiges string objekt. ok, map ist OOP und string auch aber der ansatz schreit ja schon nach polymorphie...</p>
</blockquote>
<p>Genau das wird mit der map emuliert. nur weil kein &quot;vitual&quot; drin vor kommt, heisst es nicht, dass es etwas anderes ist.</p>
<p>Ohh ich sehe, jetzt gleich beginnt wieder die Diskussion was OOP ist :).</p>
<p>Nebenbei würde ich weder string noch map pauschal unter OOP einordnen. OOP ist nicht einfach nur &quot;Funktionen und Daten zusammenklatschen&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2126178</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2126178</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sun, 02 Oct 2011 12:10:29 GMT</pubDate></item><item><title><![CDATA[Reply to [Anfänger] Funktionen dynamisch aufrufen? on Sun, 02 Oct 2011 12:32:26 GMT]]></title><description><![CDATA[<p>Die Taktik-Methode wird wohl kaum das einzige sein, das sich von Gegner zu Gegner unterscheidet.<br />
Neben unterschiedlichen Grundeigenschaften (etwa Lebenspunkte), reagieren manche Gegner vielleicht auf Angriffe anders, bzw. können diese unter speziellen Bedingungen abwehren bzw. zeigen spezielles Verhalten bei anderen Ereignissen in der Spielwelt, was sich alles bequem mit virtuellen Methoden regeln lässt.<br />
Mit Klassen hat man sämtlichen gegnerspezifischen Code an <em>einer</em> Stelle im Code beisammen und nicht nach C-Manier an hundert verschiedenen Stellen im Projekt verteilt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2126192</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2126192</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Sun, 02 Oct 2011 12:32:26 GMT</pubDate></item><item><title><![CDATA[Reply to [Anfänger] Funktionen dynamisch aufrufen? on Sun, 02 Oct 2011 12:50:31 GMT]]></title><description><![CDATA[<p>Aber auch der Entwurf mit virtuellen Methoden hat viele Nachteile. Natürlich kannst du Klassen &quot;Oger&quot; und &quot;Magier&quot; haben. Aber was ist mit Oger-Magiern? verhält sich im Nahkampf wie ein Oger, im Fernkampf wie ein Magier. In deinem Ansatz brauchst du ne dritte Klasse. Aber wenn du genug Kombinationsmöglichkeiten hast, dann verhält sich die Klassenanzahl exponentiell zu der Anzahl der Wahlmöglichkeiten. Und das ist tendentiell unschön. Niemand will so viele Klassen schreiben und dabei Code copy-pasten. Und wenn sich in einer implementation was ändert, musst du es direkt überall ändern.</p>
<p>Die map-variante outperformed virtual da unglaublich, weil du einfach nur für jede Wahlmöglichkeit einen String speichern kannst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2126202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2126202</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sun, 02 Oct 2011 12:50:31 GMT</pubDate></item><item><title><![CDATA[Reply to [Anfänger] Funktionen dynamisch aufrufen? on Sun, 02 Oct 2011 12:57:38 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>Aber auch der Entwurf mit virtuellen Methoden hat viele Nachteile. Natürlich kannst du Klassen &quot;Oger&quot; und &quot;Magier&quot; haben. Aber was ist mit Oger-Magiern? verhält sich im Nahkampf wie ein Oger, im Fernkampf wie ein Magier. In deinem Ansatz brauchst du ne dritte Klasse. Aber wenn du genug Kombinationsmöglichkeiten hast, dann verhält sich die Klassenanzahl exponentiell zu der Anzahl der Wahlmöglichkeiten. Und das ist tendentiell unschön. Niemand will so viele Klassen schreiben und dabei Code copy-pasten. Und wenn sich in einer implementation was ändert, musst du es direkt überall ändern.</p>
<p>Die map-variante outperformed virtual da unglaublich, weil du einfach nur für jede Wahlmöglichkeit einen String speichern kannst.</p>
</blockquote>
<p>Falsch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2126206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2126206</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 02 Oct 2011 12:57:38 GMT</pubDate></item><item><title><![CDATA[Reply to [Anfänger] Funktionen dynamisch aufrufen? on Sun, 02 Oct 2011 13:01:57 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Falsch.</p>
</blockquote>
<p>richtig.</p>
<p>Langsam wirst du unerträglich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2126209</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2126209</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sun, 02 Oct 2011 13:01:57 GMT</pubDate></item><item><title><![CDATA[Reply to [Anfänger] Funktionen dynamisch aufrufen? on Sun, 02 Oct 2011 14:00:27 GMT]]></title><description><![CDATA[<p>Wenn Du Die String-Sache weiter ausprogrammierst, wirst Du bemerken, daß Du doch nur auf Nahkampf und Fernkampf switchst, dann kaufst Du Dir Mar++us' Buch und stellst fest, daß Du virtuelle Funktionen hättest nehmen sollen.<br />
Und ich erwarte, daß ich das nicht mehr aussprechen muß; du hast die Anfangsgründe doch eigentlich schon hinter Dir.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2126234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2126234</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 02 Oct 2011 14:00:27 GMT</pubDate></item><item><title><![CDATA[Reply to [Anfänger] Funktionen dynamisch aufrufen? on Sun, 02 Oct 2011 15:23:32 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Wenn Du Die String-Sache weiter ausprogrammierst, wirst Du bemerken, daß Du doch nur auf Nahkampf und Fernkampf switchst</p>
</blockquote>
<p>ich vermute mal, dass die Taktiken eines Magiers im Fernkampf anders sein sollten als die Taktiken eines Bogenschützen. Ich könnte ja auch einen Oger-Bogenschützen machen wollen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    />.</p>
<p>In der Tat hatte ich schon einmal das Problem der kombinatorischen Explosion. Ich habe einen anderen mechanismus zur Lösung verwendet, virtual kam am Ende aber trotzdem nicht mehr vor (und mir wurde es erspart, ca 125 Versionen einer Klasse zu schreiben).</p>
<p>Worauf ich halt hinaus wollte: virtual ist nicht mehr die optimale Lösung, wenn deine Objektkategorien Strukturen haben, die die Menge der Kategorien groß werden lassen. In dem Fall: #Anzahl Rassen x #Anzahl Nahkampfstrategien x #AnzahlFernkampfstrategien. Da ist es besser nicht mehr zu sagen: &quot;Ein Oger ist ein Gegner&quot;, sondern &quot;Ein Gegner hat eine Rasse, eine Nahkampfstrategie und eine FernkampfStrategie&quot;. Die &quot;hat&quot;-Beziehung lässt sich recht unproblematisch auf unterschiedliche Arten Ausdrücken. Zugriff auf eine Map ist okay, Zeiger auch. Allerdings ist beim zeiger die map nur in einem anderen Teil des Programms versteckt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2126268</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2126268</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sun, 02 Oct 2011 15:23:32 GMT</pubDate></item></channel></rss>