<?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[Funktionsname an anderes Objekt übergeben und ausführen]]></title><description><![CDATA[<p>Ich steh momentan vor einem Problem. Hab auch schon das Internet gefragt und bin auf einige Sachen gestoßen die nützlich sein könnten, aber ich komme einfach zu keiner Lösung.</p>
<p>Im Grunde möchte ich in einem Objekt (Objekt1) einen Funktionsnamen an ein anderes Objekt (Objekt2) übergeben. In Objekt2 möchte ich den übergebenen Funktionsnamen als Funktion zu einem späteren Zeitpunkt ausführen. Ich habe verschiedenes gefunden, wie zB template&lt;typename Func&gt; oder boost::function und boost::bind. Die Beispiele die ich gefunden habe verstehe ich ganz gut, aber leider kann ich das nicht auf meine Situation anwenden. Hat da jemand vielleicht einen Tipp?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/333850/funktionsname-an-anderes-objekt-übergeben-und-ausführen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 26 Apr 2026 08:58:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/333850.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 05 Aug 2015 01:42:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktionsname an anderes Objekt übergeben und ausführen on Wed, 05 Aug 2015 01:42:32 GMT]]></title><description><![CDATA[<p>Ich steh momentan vor einem Problem. Hab auch schon das Internet gefragt und bin auf einige Sachen gestoßen die nützlich sein könnten, aber ich komme einfach zu keiner Lösung.</p>
<p>Im Grunde möchte ich in einem Objekt (Objekt1) einen Funktionsnamen an ein anderes Objekt (Objekt2) übergeben. In Objekt2 möchte ich den übergebenen Funktionsnamen als Funktion zu einem späteren Zeitpunkt ausführen. Ich habe verschiedenes gefunden, wie zB template&lt;typename Func&gt; oder boost::function und boost::bind. Die Beispiele die ich gefunden habe verstehe ich ganz gut, aber leider kann ich das nicht auf meine Situation anwenden. Hat da jemand vielleicht einen Tipp?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462551</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 05 Aug 2015 01:42:32 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsname an anderes Objekt übergeben und ausführen on Wed, 05 Aug 2015 02:07:31 GMT]]></title><description><![CDATA[<p>Vielleicht einfach ein Zeiger?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462554</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462554</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 05 Aug 2015 02:07:31 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsname an anderes Objekt übergeben und ausführen on Wed, 05 Aug 2015 02:24:10 GMT]]></title><description><![CDATA[<p>Ich hatte das Beispiel hier gesehen<br />
<a href="http://www.radmangames.com/programming/how-to-use-boost-bind" rel="nofollow">http://www.radmangames.com/programming/how-to-use-boost-bind</a></p>
<pre><code>#include &quot;boost/function.hpp&quot; 
#include &quot;boost/bind.hpp&quot; 

#include &lt;string&gt; 
#include &lt;iostream&gt; 

namespace 
{ 
  void function(int number, float floatation, std::string string) 
  { 
    std::cout &lt;&lt; &quot;Int: \&quot;&quot; &lt;&lt; number &lt;&lt; &quot;\&quot; Float: \&quot;&quot; &lt;&lt; floatation 
              &lt;&lt; &quot;\&quot; String: \&quot;&quot; &lt;&lt; string &lt;&lt; &quot;\&quot;&quot; &lt;&lt; std::endl; 
  } 

} // namespace 

int main(int c, char** argv) 
{ 
  // declare function pointer variables 
  boost::function&lt;void(std::string, float, int)&gt; shuffleFunction; 
  boost::function&lt;void(void)&gt; voidFunction; 
  boost::function&lt;void(float)&gt; reducedFunction; 

  // bind the methods 
  shuffleFunction = boost::bind(::function, _3, _2, _1); 
  voidFunction = boost::bind(::function, 5, 5.f, &quot;five&quot;); 
  reducedFunction = boost::bind(::function, 13, _1, &quot;empty&quot;); 

  // call the bound functions 
  shuffleFunction(&quot;String&quot;, 0.f, 0); 
  voidFunction(); 
  reducedFunction(13.f); 

} // main
</code></pre>
<p>wenn ::function wenigstens ein String sein könnte wäre das alles kein Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462555</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 05 Aug 2015 02:24:10 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsname an anderes Objekt übergeben und ausführen on Wed, 05 Aug 2015 02:33:01 GMT]]></title><description><![CDATA[<p>@Bennisen<br />
Naja C++ kann das einfach nicht.<br />
Wenn du uns verrätst was das X zu deinem Y ist können wir dir aber vielleicht trotzdem helfen.</p>
<p>Oder anders gesagt...</p>
<p>Bennisen schrieb:</p>
<blockquote>
<p>aber leider kann ich das nicht auf meine Situation anwenden.</p>
</blockquote>
<p>Und zwar <em>wieso</em> nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462556</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 05 Aug 2015 02:33:01 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsname an anderes Objekt übergeben und ausführen on Wed, 05 Aug 2015 03:35:08 GMT]]></title><description><![CDATA[<p>Bei mir hakt es an der Übergabe von Objekt1 zu Objekt2, da weiß ich nicht genau wie ich das machen soll. Zu mal die Beispiele die ich gesehen habe, es benötigen das die Funktion, die ich übergeben will, in Objekt1 existieren muss.Bei diesem Beispiel</p>
<pre><code>// member 
  Class* objPtr = new Class(); 
  typedef void (Class::*OverloadFuncType)(float); 
  boost::bind(static_cast&lt;OverloadFuncType&gt;(&amp;Class::overload), objPtr, _1);
</code></pre>
<p>ist mir nicht ganz klar wo die Funktion selber landet. Kann ich sie irgendwo drin speichern?<br />
Wenn ich die Funktion selber irgendwie in Objekt2 bekommen würde, dann käme ich schon ein ganzes Stück weiter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462560</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462560</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 05 Aug 2015 03:35:08 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsname an anderes Objekt übergeben und ausführen on Wed, 05 Aug 2015 04:25:36 GMT]]></title><description><![CDATA[<p>Erklär doch einfach, was du letztlich erreichen möchtest, anstatt zu versuchen (völlig veralteten) Code zu entziffern, der höchstwahrscheinlich überhaupt nichts mit einer späteren Lösung zu tun haben wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462562</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462562</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 05 Aug 2015 04:25:36 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsname an anderes Objekt übergeben und ausführen on Wed, 05 Aug 2015 04:44:19 GMT]]></title><description><![CDATA[<p>Ich habe eine Klasse die sich Params nennt. Diese nimmt die Argumente entgegen die von der Commandline kommen. Diese sollen dann in der Params Klasse überprüft werden und die entsprechende Funktion soll an meine andere Klasse System übergeben werden. Es wird überprüft wie das Argument argv[1] aussieht. Zum Beispiel &quot;-d&quot; und anhand des Arguments soll eine entsprechende Funktion ausgelöst werden. Ich möchte die Funktion aber nicht direkt aufrufen sondern erst ganz zum Schluss über die Klasse System und der Methode execute.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462563</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462563</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 05 Aug 2015 04:44:19 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsname an anderes Objekt übergeben und ausführen on Wed, 05 Aug 2015 05:44:20 GMT]]></title><description><![CDATA[<p>Was ist denn die Rolle der System-Klasse in deiner Modellierung und woher kommen überhaupt die Funktionen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462565</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462565</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 05 Aug 2015 05:44:20 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsname an anderes Objekt übergeben und ausführen on Wed, 05 Aug 2015 09:54:57 GMT]]></title><description><![CDATA[<p>Bennisen schrieb:</p>
<blockquote>
<p>Ich habe eine Klasse die sich Params nennt. Diese nimmt die Argumente entgegen die von der Commandline kommen. Diese sollen dann in der Params Klasse überprüft werden und die entsprechende Funktion soll an meine andere Klasse System übergeben werden. Es wird überprüft wie das Argument argv[1] aussieht. Zum Beispiel &quot;-d&quot; und anhand des Arguments soll eine entsprechende Funktion ausgelöst werden. Ich möchte die Funktion aber nicht direkt aufrufen sondern erst ganz zum Schluss über die Klasse System und der Methode execute.</p>
</blockquote>
<p>Suchst du also sowas?</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;functional&gt;
#include &lt;cstring&gt;

class Foo
{
public:
	void setFunction(const std::function&lt;void()&gt;&amp; f)
	{
		m_func = f;
	}

	void execute()
	{
		if(m_func)
			m_func();
	}

private:
	std::function&lt;void()&gt; m_func;
};

void a()
{
	std::cout &lt;&lt; &quot;a executed&quot; &lt;&lt; std::endl;
}

void b()
{
	std::cout &lt;&lt; &quot;b executed&quot; &lt;&lt; std::endl;
}

int main(int argc, char** argv)
{
	if(argc == 2)
	{
		Foo f;
		if(strcmp(argv[1], &quot;-a&quot;) == 0)
			f.setFunction(a);
		else if(strcmp(argv[1], &quot;-b&quot;) == 0)
			f.setFunction(b);

		std::cout &lt;&lt; &quot;Starting execution&quot; &lt;&lt; std::endl;
		f.execute();
	}
}
</code></pre>
<p>In einem <code>std::function</code> Objekt kannst du so ziemlich alles speichern was man irgendwie aufrufen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462607</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Wed, 05 Aug 2015 09:54:57 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsname an anderes Objekt übergeben und ausführen on Wed, 05 Aug 2015 10:40:30 GMT]]></title><description><![CDATA[<p>@Bennisen<br />
Kennst du Lambda-Expressions?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462613</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462613</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 05 Aug 2015 10:40:30 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsname an anderes Objekt übergeben und ausführen on Wed, 05 Aug 2015 13:34:14 GMT]]></title><description><![CDATA[<p>@seb707 ja sowas ähnliches suche ich, aber momentan glaube ich dass das was ich vorhabe nicht geht. In meinem Fall ist die Funktion a und b in der Klasse Foo. Der Aufruf f.setFunction(a) oder f.setFunction(b) würde dann nicht gehen, da er die Funktion a und b nicht findet.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a> schau ich mir mal an</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462641</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 05 Aug 2015 13:34:14 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsname an anderes Objekt übergeben und ausführen on Wed, 05 Aug 2015 13:39:02 GMT]]></title><description><![CDATA[<p>Bennisen schrieb:</p>
<blockquote>
<p>@seb707 ja sowas ähnliches suche ich, aber momentan glaube ich dass das was ich vorhabe nicht geht. In meinem Fall ist die Funktion a und b in der Klasse Foo. Der Aufruf f.setFunction(a) oder f.setFunction(b) würde dann nicht gehen, da er die Funktion a und b nicht findet.</p>
</blockquote>
<p>Doch das geht. Gibt mehrere Möglichkeiten, eine davon sind die genannten Lambda Expressions. Würde dann so aussehen:</p>
<pre><code>Foo f;
if(strcmp(argv[1], &quot;-a&quot;) == 0)
	f.setFunction([&amp;f]() { f.a(); });
else if(strcmp(argv[1], &quot;-b&quot;) == 0)
	f.setFunction([&amp;f]() { f.b(); });
</code></pre>
<p>Man kann auch irgendwas mit bind oder so ähnlich machen aber seitdem es Lambdas gibt ist das eigentlich obsolet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462642</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Wed, 05 Aug 2015 13:39:02 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsname an anderes Objekt übergeben und ausführen on Wed, 05 Aug 2015 13:50:24 GMT]]></title><description><![CDATA[<p>Nochmal ein vollständigeres Beispiel mit Parametern, Rückgabewerten und beiden Varianten mit Lambdas und <code>std::bind</code> :</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;functional&gt;
#include &lt;cstring&gt;

class Foo
{
public:
	void setFunction(const std::function&lt;int(int)&gt;&amp; f)
	{
		m_func = f;
	}

	void execute(int x)
	{
		if(m_func)
			std::cout &lt;&lt; &quot;Function returned: &quot; &lt;&lt; m_func(x) &lt;&lt; std::endl;
	}

	int a(int x)
	{
		std::cout &lt;&lt; &quot;a executed: &quot; &lt;&lt; x &lt;&lt; std::endl;
		return 1;
	}

	int b(int x)
	{
		std::cout &lt;&lt; &quot;b executed: &quot; &lt;&lt; x &lt;&lt; std::endl;
		return 2;
	}

private:
	std::function&lt;int(int)&gt; m_func;
};

int main(int argc, char** argv)
{
	if(argc == 2)
	{
		Foo f;
		if(strcmp(argv[1], &quot;-a&quot;) == 0)
			f.setFunction([&amp;f](int x) { return f.a(x); });                 // Lambda
		else if(strcmp(argv[1], &quot;-b&quot;) == 0)
			f.setFunction(std::bind(&amp;Foo::b, &amp;f, std::placeholders::_1));  // std::bind

		std::cout &lt;&lt; &quot;Starting execution&quot; &lt;&lt; std::endl;
		f.execute(7);
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2462646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462646</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Wed, 05 Aug 2015 13:50:24 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsname an anderes Objekt übergeben und ausführen on Wed, 05 Aug 2015 15:08:33 GMT]]></title><description><![CDATA[<p>@sebi707 Vielen Dank dein Beispiel hat mir sehr geholfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462666</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462666</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 05 Aug 2015 15:08:33 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsname an anderes Objekt übergeben und ausführen on Wed, 05 Aug 2015 16:59:23 GMT]]></title><description><![CDATA[<p>Das <code>[&amp;f](int x) { return f.a(x); }</code> Ding ist im übrigen ne Lambda-Expression <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462679</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462679</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 05 Aug 2015 16:59:23 GMT</pubDate></item></channel></rss>