<?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[Methodenaufrufe speichern]]></title><description><![CDATA[<p>Hi,</p>
<p>ich weiss garnicht ob das überhaupt in C++ vorgesehen ist aber ich will, so mein Gedanke zumindestens, ein Methodenaufruf speichern so das man die verknüpften Methoden später wieder aufrufen kann.</p>
<p>Also ich will sowas wie im Pseudocode in der Art machen können:</p>
<pre><code class="language-cpp">class foobar
{
public:
         void register();
         void proc(int);
         void func(std::string);
};

void foobar::register()
{
  container-&gt;append(&quot;foo&quot;, int, void proc(int));
  container-&gt;append(&quot;hello&quot;, std::string, void func(std::string));
}
//...

void anywhrere::update(std::string name)
{
  if (name == &quot;foor&quot;)
       container-&gt;method(container-&gt;param); // Aufruf von proc(int) mit dem abgespeicherten Parameter int
  else if(name == &quot;hello&quot;)
       container-&gt;method(container-&gt;param); // Aufruf von func(std::string) mit dem abgespeicherten Parameter std::string
}
</code></pre>
<p>Ist das so überhaupt möglich oder gibt es vielleicht ein Design Pattern dazu? <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>
<p>Gruss,<br />
xmarvel</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/154955/methodenaufrufe-speichern</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 02:29:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/154955.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 01 Aug 2006 10:06:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Methodenaufrufe speichern on Tue, 01 Aug 2006 10:07:29 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich weiss garnicht ob das überhaupt in C++ vorgesehen ist aber ich will, so mein Gedanke zumindestens, ein Methodenaufruf speichern so das man die verknüpften Methoden später wieder aufrufen kann.</p>
<p>Also ich will sowas wie im Pseudocode in der Art machen können:</p>
<pre><code class="language-cpp">class foobar
{
public:
         void register();
         void proc(int);
         void func(std::string);
};

void foobar::register()
{
  container-&gt;append(&quot;foo&quot;, int, void proc(int));
  container-&gt;append(&quot;hello&quot;, std::string, void func(std::string));
}
//...

void anywhrere::update(std::string name)
{
  if (name == &quot;foor&quot;)
       container-&gt;method(container-&gt;param); // Aufruf von proc(int) mit dem abgespeicherten Parameter int
  else if(name == &quot;hello&quot;)
       container-&gt;method(container-&gt;param); // Aufruf von func(std::string) mit dem abgespeicherten Parameter std::string
}
</code></pre>
<p>Ist das so überhaupt möglich oder gibt es vielleicht ein Design Pattern dazu? <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>
<p>Gruss,<br />
xmarvel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1108344</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1108344</guid><dc:creator><![CDATA[xmarvel]]></dc:creator><pubDate>Tue, 01 Aug 2006 10:07:29 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenaufrufe speichern on Tue, 01 Aug 2006 10:17:46 GMT]]></title><description><![CDATA[<p>suchst du sowas wie boost::bind?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1108360</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1108360</guid><dc:creator><![CDATA[Glamdrink]]></dc:creator><pubDate>Tue, 01 Aug 2006 10:17:46 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenaufrufe speichern on Tue, 01 Aug 2006 10:23:02 GMT]]></title><description><![CDATA[<blockquote>
<p>ich weiss gar nicht ob das überhaupt in C++ vorgesehen</p>
</blockquote>
<p>Ist vorstehen siehe Funktionspointer (C) bzw. Funktoren/Funktionsobjekte (C++).<br />
<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/1108368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1108368</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Tue, 01 Aug 2006 10:23:02 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenaufrufe speichern on Tue, 01 Aug 2006 10:27:53 GMT]]></title><description><![CDATA[<p>oder hier: <a href="http://www.newty.de/fpt/index.html" rel="nofollow">http://www.newty.de/fpt/index.html</a></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1108372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1108372</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 01 Aug 2006 10:27:53 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenaufrufe speichern on Tue, 01 Aug 2006 21:59:01 GMT]]></title><description><![CDATA[<p>Danke für die vielen Antworten.<br />
Hab mir jetzt alles durchgelesen und wie ich sehe funktioniert es doch nicht so wie ich gedacht habe da ich ja unterschiedliche Parameter für die Funktionen habe und diese nicht alle gleich sind aber das ist ja eine Vorrausetzung für die Funktionsobjekte.<br />
Oder gibt es dafür ein Ausweg vielleicht mit Templates oder Macros?</p>
<p>Gruss,<br />
xmarvel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1108877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1108877</guid><dc:creator><![CDATA[xmarvel]]></dc:creator><pubDate>Tue, 01 Aug 2006 21:59:01 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenaufrufe speichern on Tue, 01 Aug 2006 23:20:58 GMT]]></title><description><![CDATA[<p>eine möglichkeit wäre die paramter in einer string map zu übergeben, du müsstest die werte halt wieder in integer, floats etc. umwandeln. die ogre engine macht das zum beispiel so ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1108900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1108900</guid><dc:creator><![CDATA[gast4646544846]]></dc:creator><pubDate>Tue, 01 Aug 2006 23:20:58 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenaufrufe speichern on Wed, 02 Aug 2006 06:26:47 GMT]]></title><description><![CDATA[<p>Bei Funktionsobjekten kann man die Member-Variablen als Parameter für die eigentliche Funktion benutzen....</p>
<p>Somit lassen sich x beliebig viele auch von Objekt zu Objekt unterschiedliche Parameter verarbeiten, wenn man eine Schnittstellen-Klasse verwendet.</p>
<p>Außerdem hat dies den Vorteil, dass man die Parameter mitspeichert... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1108932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1108932</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Wed, 02 Aug 2006 06:26:47 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenaufrufe speichern on Wed, 02 Aug 2006 07:25:48 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Mal eine Überlegung:</p>
<pre><code class="language-cpp">class BaseClass;

typedef void ( BaseClass::*eventCallback_t )( void );

class EventFunc
{
public:
	const char *name;
	eventCallback_t	func;
};

class BaseClass
{
	enum { EVENT_MAX_ARGS = 3 };

public:
	static EventFunc	eventCallbacks[];

public:
	bool Call( const char *name )
	{
		return CallArgs( name, 0 );
	}

	template&lt; class Arg1 &gt;
	bool Call( const char *name, Arg1 arg1 )	
	{
		return CallArgs( name, 1, arg1 );
	}

	template&lt; class Arg1, class Arg2 &gt;
	bool Call( const char *name, Arg1 arg1, Arg2 arg2 )
	{
		return CallArgs( name, 2, arg1, arg2 );
	}

	template&lt; class Arg1, class Arg2, class Arg3 &gt;
	bool Call( const char *name, Arg1 arg1, Arg2 arg2, Arg3 arg3 )
	{
		return CallArgs( name, 3, arg1, arg2, arg3 );
	}

	bool CallArgs( const char *name, int numargs, ... )
	{	
		int data[ EVENT_MAX_ARGS ];
		va_list args;

		va_start( args, numargs );

		for ( int i = 0; i &lt; numargs; ++i )
		{
			data[ i ] = ( int )va_arg( args, int * );
		}		

		va_end( args );

		return CallArgsPtr( name, numargs, data );
	}

	bool CallArgsPtr( const char *name, int numargs, int *data )
	{
		EventFunc *p = Find( name );
		eventCallback_t callback;

		if ( !p )
			return false;

		callback = p-&gt;func;

		switch ( numargs )
		{
		case 0:
			( this-&gt;*callback )();
			break;

		case 1:
			typedef void ( BaseClass::*eventCallback_1_t )( const int );
			( this-&gt;*( eventCallback_1_t )callback )( data[ 0 ] );
			break;

		case 2:
			typedef void ( BaseClass::*eventCallback_2_t )( const int, const int );
			( this-&gt;*( eventCallback_2_t )callback )( data[ 0 ], data[ 1 ] );
			break;

		case 3:
			typedef void ( BaseClass::*eventCallback_3_t )( const int, const int, const int );
			( this-&gt;*( eventCallback_3_t )callback )( data[ 0 ], data[ 1 ], data[ 2 ] );
			break;

		default:
			std::cout &lt;&lt; &quot;unknown number of arguments\n&quot;;
			return false;
		}

		return true;
	}

	EventFunc *Find( const char *name ) const
	{
		int i = 0;
		EventFunc *p = NULL;

		while ( true )
		{
			p = &amp;eventCallbacks[ i ];

			if ( !p-&gt;func )
				break;

			if ( !strcmp( p-&gt;name, name ) )
				return p;

			i++;
		}

		return NULL;
	}

	// test fkt
	void Foo() const
	{
		std::cout &lt;&lt; &quot;Foo&quot; &lt;&lt; std::endl;
	}

	void Add( int x, int y ) const
	{
		int res = x+y;
		std::cout &lt;&lt; res &lt;&lt; std::endl;
	}

	void Print( const char *str ) const
	{
		std::cout &lt;&lt; str &lt;&lt; std::endl;
	}
};

EventFunc BaseClass::eventCallbacks[] = 
{
	{ &quot;Foo&quot;, ( void ( BaseClass::* )( void ) )( &amp;BaseClass::Foo ) },
	{ &quot;Add&quot;, ( void ( BaseClass::* )( void ) )( &amp;BaseClass::Add ) },
	{ &quot;Print&quot;, ( void ( BaseClass::* )( void ) )( &amp;BaseClass::Print ) },
	{ NULL, NULL }
};

int main( void )
{
	BaseClass cls;
	cls.Call( &quot;Print&quot;, &quot;Hallo Welt&quot; );
	cls.Call( &quot;Add&quot;, 10, 20 );
	cls.Call( &quot;haha&quot;, 50 );

	return 0;
}
</code></pre>
<p>Unten ist ein Anwendungsbeispiel. Aber Achtung: dieser Quellcode ist nicht besonders ausgereift, von wegen Exceptionhandling und sonstigen Sicherheitsvorkehrungen! Noch dazu werden Rückgabewerte nicht berücksichtigt... <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="🙂"
    /> Er soll nur einen simplen Lösungsansatz darstellen.</p>
<p>grüße <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/1108953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1108953</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Wed, 02 Aug 2006 07:25:48 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenaufrufe speichern on Wed, 02 Aug 2006 12:42:23 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10754">@David_pb</a></p>
<p>danke für dein Beispielcode hat mir sehr weitergeholfen</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10111">@Mathias</a></p>
<p>hmm... na mehrmaligen durchlesen weiss ich nicht was du meinst kannst du das vielleicht mit ein kurzen beispiel klar machen.</p>
<p>@gast4646544846</p>
<p>danke für den Hinweis.<br />
Hab mir mal mit Hilfe euer Ideen mir ein Beispiel Code zusammengebastelt wundert euch nicht das es Qt ist später soll das mit den Qt Libs funktionieren. Aber das Prinzip ist bleibt ja C++. <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 hier mein Testcode zum rumspielen:</p>
<pre><code class="language-cpp">#include &lt;QtCore&gt;

class MyOtherMethods
{
  public:
	void showOtherString(QString s)
		{
			qDebug(&quot;String Other Out: %s&quot;, s.toStdString().c_str());
		};
	void showOtherQLine(QLine l)
		{
			qDebug(&quot;Line Out: x: %i y: %i&quot;, l.x1(), l.y1());
		};
};

class MyMethods
{
	public:
		void showString(const QString&amp; s)
		{
			qDebug(&quot;String Out: %s&quot;, s.toStdString().c_str());
		};

		void showInt(int i)
		{
			qDebug(&quot;Int Out: %i&quot;, i);
		};
};

class Container
{
  public:
	template &lt;class T, class Z&gt;
	void call(QVariant value, void (T::*func)(Z))
	{
		qDebug(&quot;Type Name: %s&quot;, value.typeName());
		T instance;
		(instance.*func)(qVariantValue&lt;Z&gt;(value));
	};
};

int main()
{
 Container con;
 con.call(&quot;Hello World&quot;, &amp;MyMethods::showString); // hier bricht er ab wegen dem const QString&amp; als Parameter
 con.call(20, &amp;MyMethods::showInt);
 con.call(&quot;FOOBAR&quot;, &amp;MyOtherMethods::showOtherString);
 con.call(QLine(2,5,100,150), &amp;MyOtherMethods::showOtherQLine);

 return 0;
}
</code></pre>
<p>Es funktioniert soweit auch schon ganz gut das einzigste Problem ist wenn der Parameter als Reference deklariert ist. Dann lässt es sich nicht mehr compilieren da er den Pointer anscheinend nicht mehr konvertiert bekommt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Hier die Fehlermeldung vom Compiler:</p>
<pre><code>Scanning dependencies of target func
Building CXX object CMakeFiles/func.dir/main.o
/opt/Trolltech-Qt4.2/include/QtCore/qvariant.h: In function ‘T qvariant_cast(const QVariant&amp;) [with T = const QString&amp;]’:
/opt/Trolltech-Qt4.2/include/QtCore/qvariant.h:637:   instantiated from ‘T qVariantValue(const QVariant&amp;) [with T = const QString&amp;]’
/home/xmarvel/Funktionsobjekte/main.cpp:38:   instantiated from ‘void Container::call(QVariant, void (T::*)(Z)) [with T = MyMethods, Z = const QString&amp;]’
/home/xmarvel/Funktionsobjekte/main.cpp:47:   instantiated from here
/opt/Trolltech-Qt4.2/include/QtCore/qvariant.h:624: error: forming pointer to reference type ‘const QString&amp;’
/opt/Trolltech-Qt4.2/include/QtCore/qvariant.h:626: error: forming pointer to reference type ‘const QString&amp;’
/opt/Trolltech-Qt4.2/include/QtCore/qvariant.h:628: error: ‘t’ declared as reference but not initialized
/opt/Trolltech-Qt4.2/include/QtCore/qvariant.h:629: error: invalid conversion from ‘const void*’ to ‘void*’
/opt/Trolltech-Qt4.2/include/QtCore/qvariant.h:629: error:   initializing argument 3 of ‘bool qvariant_cast_helper(const QVariant&amp;, QVariant::Type, void*)’
/opt/Trolltech-Qt4.2/include/QtCore/qvariant.h:632: warning: returning reference to temporary
make[2]: *** [CMakeFiles/func.dir/main.o] Fehler 1
make[1]: *** [CMakeFiles/func.dir/all] Fehler 2
make: *** [all] Fehler 2
</code></pre>
<p>kann ich das umgehen ohne das ich bei der Methode showString den Parameter ändere?</p>
<p>Gruss,<br />
xmarvel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1109188</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109188</guid><dc:creator><![CDATA[xmarvel]]></dc:creator><pubDate>Wed, 02 Aug 2006 12:42:23 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenaufrufe speichern on Wed, 02 Aug 2006 13:16:25 GMT]]></title><description><![CDATA[<p>xmarvel schrieb:</p>
<blockquote>
<p>Hab mir mal mit Hilfe euer Ideen mir ein Beispiel Code zusammengebastelt wundert euch nicht das es Qt ist später soll das mit den Qt Libs funktionieren. Aber das Prinzip ist bleibt ja C++. <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>
<p>Schon, nur liegt der Fehler bei QVariant.</p>
<p>mfg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1109225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109225</guid><dc:creator><![CDATA[joomoo]]></dc:creator><pubDate>Wed, 02 Aug 2006 13:16:25 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenaufrufe speichern on Wed, 02 Aug 2006 13:57:16 GMT]]></title><description><![CDATA[<p>na da wirft mir Qt ja Steine in den Weg <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="🤡"
    /> dann muss ich meine Idee anscheinend irgendwie anders angehen.<br />
Aber danke an Alle für die Unterstützung.</p>
<p>Gruss,<br />
xmarvel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1109266</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109266</guid><dc:creator><![CDATA[xmarvel]]></dc:creator><pubDate>Wed, 02 Aug 2006 13:57:16 GMT</pubDate></item></channel></rss>