<?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[Methode als Parameter]]></title><description><![CDATA[<p>Hi,</p>
<p>habe folgende Methode:</p>
<pre><code class="language-cpp">void IPluginInterface::addFunction(std::string name, void* function);
</code></pre>
<p>Das ganze soll ein Plugin System werden wo der späterer Plugin Schreiber eigene Methoden definieren/schreiben kann und diese dann mit addFunction bekannt geben soll.</p>
<p>im Plugin cpp</p>
<pre><code class="language-cpp">void PScreenSaver::initFunctions()
{
 addFunction(&quot;Rectangle&quot;, Rectangle());
}

void PScreenSaver::Rectangle()
{
 cout &lt;&lt; &quot;foobar&quot; &lt;&lt; endl;
}
</code></pre>
<p>als fehlermeldung bekomme ich folgendes</p>
<pre><code>screensaver.cpp:12: error: invalid use of void expression
</code></pre>
<p>kann mir da jemand helfen?</p>
<p>MFG<br />
xmarvel</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/111195/methode-als-parameter</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 18:03:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/111195.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 29 May 2005 14:20:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Methode als Parameter on Sun, 29 May 2005 14:20:17 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>habe folgende Methode:</p>
<pre><code class="language-cpp">void IPluginInterface::addFunction(std::string name, void* function);
</code></pre>
<p>Das ganze soll ein Plugin System werden wo der späterer Plugin Schreiber eigene Methoden definieren/schreiben kann und diese dann mit addFunction bekannt geben soll.</p>
<p>im Plugin cpp</p>
<pre><code class="language-cpp">void PScreenSaver::initFunctions()
{
 addFunction(&quot;Rectangle&quot;, Rectangle());
}

void PScreenSaver::Rectangle()
{
 cout &lt;&lt; &quot;foobar&quot; &lt;&lt; endl;
}
</code></pre>
<p>als fehlermeldung bekomme ich folgendes</p>
<pre><code>screensaver.cpp:12: error: invalid use of void expression
</code></pre>
<p>kann mir da jemand helfen?</p>
<p>MFG<br />
xmarvel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/798313</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/798313</guid><dc:creator><![CDATA[xmarvel]]></dc:creator><pubDate>Sun, 29 May 2005 14:20:17 GMT</pubDate></item><item><title><![CDATA[Reply to Methode als Parameter on Sun, 29 May 2005 14:51:34 GMT]]></title><description><![CDATA[<p>Mach das doch einfach so</p>
<pre><code class="language-cpp">void IPluginInterface::addFunction(void (*function) (void));
void Rectangle (void);

void PScreenSaver::initFunctions()
{
 addFunction(Rectangle); //Ohne die Klammern, sonst ruft man die Funktion auf, und nimmt nicht ihre Adresse
}
</code></pre>
<p>So wie du es gemacht hast, rufst du in dem Aufruf von addFunction die Funktion Rectangle auf, und nimmst nicht ihre Adresse. Außerdem solltest du in dem Prototyp von IPluginInterface::addFunction keinen Zeiger auf void (also auf Beliebiges) definieren, sondern einen Zeiger auf einen Funktion, damit man die später auch ohne zu casten aufrufen kann, außerdem kann man sonst auch Funktionen übergeben, die Argumente übernehmen müssten, denen dann aber keine übergeben werden (oder noch schlimmer irgendwelche Adresen von irgendetwas, was dann als Funktion interpretiert wird).</p>
<p>Was das mit den Namen der Funktion in IPluginInterface::addFunction soll, verstehe ich nicht wirklich, kanst du mir mal erklären, wozu du das benutzen willst?</p>
<p>Felix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/798340</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/798340</guid><dc:creator><![CDATA[Phoemuex]]></dc:creator><pubDate>Sun, 29 May 2005 14:51:34 GMT</pubDate></item><item><title><![CDATA[Reply to Methode als Parameter on Sun, 29 May 2005 14:53:13 GMT]]></title><description><![CDATA[<blockquote>
<p>keinen Zeiger auf void (also auf Beliebiges) definieren, sondern einen Zeiger auf einen Funktion</p>
</blockquote>
<p>Afair kann man nicht einfach jede Funktion nach void* casten, auf deutsch, das dürfte gar nicht funktionieren.</p>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/798343</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/798343</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Sun, 29 May 2005 14:53:13 GMT</pubDate></item><item><title><![CDATA[Reply to Methode als Parameter on Sun, 29 May 2005 15:02:37 GMT]]></title><description><![CDATA[<p>Hast Recht, ich dachte immer, mit reinterpret_cast würde man Alles zu Allem gecastet kriegen, sorry mein Fehler!</p>
<p>Felix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/798352</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/798352</guid><dc:creator><![CDATA[Phoemuex]]></dc:creator><pubDate>Sun, 29 May 2005 15:02:37 GMT</pubDate></item><item><title><![CDATA[Reply to Methode als Parameter on Sun, 29 May 2005 16:12:43 GMT]]></title><description><![CDATA[<p>thx für die schnelle antwort.</p>
<blockquote>
<p>(oder noch schlimmer irgendwelche Adresen von irgendetwas, was dann als Funktion interpretiert wird).</p>
</blockquote>
<p>stimmt daran hab ich garnicht gedacht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<blockquote>
<p>Was das mit den Namen der Funktion in IPluginInterface::addFunction soll, verstehe ich nicht wirklich, kanst du mir mal erklären, wozu du das benutzen willst?</p>
</blockquote>
<p>Wenn Plugins geladen werden. Dann sollen entsprechende Einträge auf der Oberläche erscheinen der Name ist dann das was angezeigt wird.<br />
Hab das mit dem Namen erstmal rausgenommen und dann so verändert wie du geschrieben hast. Leider bekomm ich jetzt so ein Fehler:</p>
<pre><code>screensaver.cpp: In member function `virtual void PScreenSaver::initFunctions()':
screensaver.cpp:12: error: no matching function for call to `PScreenSaver::addFunction(&lt;unknown type&gt;)'
../libinterface.h:31: error: candidates are: void IPluginInterface::addFunction(void (*)())
</code></pre>
<p>MFG<br />
xmarvel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/798424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/798424</guid><dc:creator><![CDATA[xmarvel]]></dc:creator><pubDate>Sun, 29 May 2005 16:12:43 GMT</pubDate></item><item><title><![CDATA[Reply to Methode als Parameter on Mon, 30 May 2005 14:39:46 GMT]]></title><description><![CDATA[<p>Hab jetzt verschiedene Parameter angegeben um mittels Trial &amp; Error den Fehler zu finden <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="😉"
    /><br />
Jedesmal meckert er jedoch rum das im Parameter von addFunction; Rectangle ein unknown Typ sei (siehe im vorrigen post die Fehlermeldung).<br />
Hab aber kein Ansatz woran das liegen kann.</p>
<p>Oder hab ich die Bemerkung von SideWinder falsch verstanden, dass das überhaupt nicht funktioniert? <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>MFG<br />
xmarvel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/799063</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/799063</guid><dc:creator><![CDATA[xmarvel]]></dc:creator><pubDate>Mon, 30 May 2005 14:39:46 GMT</pubDate></item><item><title><![CDATA[Reply to Methode als Parameter on Mon, 30 May 2005 14:48:24 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>wenn du den Code benutzt, den du geschrieben hast, dann uebergibst du hier eine<br />
Elementfunktion. Hierzu siehe hier:</p>
<p><a href="http://www.function-pointer.org/" rel="nofollow">http://www.function-pointer.org/</a></p>
<p>mfg<br />
v R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/799079</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/799079</guid><dc:creator><![CDATA[virtuell Realisticer]]></dc:creator><pubDate>Mon, 30 May 2005 14:48:24 GMT</pubDate></item><item><title><![CDATA[Reply to Methode als Parameter on Mon, 30 May 2005 16:49:09 GMT]]></title><description><![CDATA[<p>Hab mir den 2. Abschnitt komplett durchgelesen.<br />
Mein Code sieht jetzt so aus:</p>
<pre><code class="language-cpp">//Plugin Interface .h
class IPluginInterface
{
public:
	void addFunction(void (*function)(void));
};

// Plugin .h
class PScreenSaver : public IPluginInterface
{
public:
	void Rectangle(void);
	void initFunctions()
          {
            addFunction(&amp;PScreenSaver::Rectangle);
          };
};
</code></pre>
<p>Jetzt kommt folgende Fehlermeldung:</p>
<pre><code>screensaver.h: In member function `virtual void PScreenSaver::initFunctions()':
screensaver.h:14: error: no matching function for call to `PScreenSaver::addFunction(void (PScreenSaver::*)())'
../libinterface.h:31: error: candidates are: void IPluginInterface::addFunction(void (*)())
</code></pre>
<p>Hab da jetzt auch wieder ein bissel rumgespielt. Da ist mir aufgefallen wenn ich die addFunction Methode in der selbe Klasse definiere wo ich es aufrufe und dann als Parameter (void (PScreenSaver::*function)(void)); nehme compiliert er es ohne zu murren.<br />
Da aber die Basisklasse nicht die Unterklassen kennt kann ich dort ja auch nicht PScreensaver::*function schreiben. Wie kann ich das lösen?</p>
<p>MFG<br />
xmarvel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/799172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/799172</guid><dc:creator><![CDATA[xmarvel]]></dc:creator><pubDate>Mon, 30 May 2005 16:49:09 GMT</pubDate></item><item><title><![CDATA[Reply to Methode als Parameter on Tue, 31 May 2005 14:49:14 GMT]]></title><description><![CDATA[<p>Wenn du einfache Funktionspointer verwenden willst, dann muß deine Klassenmethode &quot;static&quot; sein, d.h. intern ohne Klassenzeiger &quot;this&quot;, also</p>
<pre><code class="language-cpp">//Plugin Interface .h
class IPluginInterface
{
public:
    void addFunction(void (*function)(void));
};

// Plugin .h
class PScreenSaver : public IPluginInterface
{
public:
    static void Rectangle(void);
    void initFunctions()
          {
            addFunction(&amp;PScreenSaver::Rectangle);
          };
};
</code></pre>
<p>Jedoch willst du wahrscheinlich in der Methode Rectangle auf Member von PScreenSaver zugreifen, so daß du evtl. Methodenzeiger verwenden solltest:</p>
<pre><code class="language-cpp">//Plugin Interface .h
class IPluginInterface
{
public:
    typedef void (IPluginInterface::*Method)(); // void entfernt
    void addMethod(Method f);
};

// Plugin .h
class PScreenSaver : public IPluginInterface
{
public:
    void Rectangle();
    void initFunctions()
    {
      addMethod(static_cast&lt;IPluginInterface::Method&gt;(&amp;PScreenSaver::Rectangle));
    }
};
</code></pre>
<p>Beim Hinzufügen wird jedoch ein &quot;cast&quot; auf den Basistyp verlangt, da Methodenzeiger leider nicht vererbbar sind.<br />
Nun kann Rectangle auch Member der Klasse PScreenSaver benutzen.</p>
<p>Hier noch der Aufruf der Methode:</p>
<pre><code class="language-cpp">void IPluginInterface::callMethod(Method f)
{
   (this-&gt;*f)();
}
</code></pre>
<p>Ansonsten gibt es auch noch die SigC-Lib bzw. boost...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/799503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/799503</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Tue, 31 May 2005 14:49:14 GMT</pubDate></item><item><title><![CDATA[Reply to Methode als Parameter on Tue, 31 May 2005 14:36:52 GMT]]></title><description><![CDATA[<p>danke für eure Hilfe jetzt funktioniert es einwandfrei. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Nur als kleine Ergänzung für die den kleinen Code von Th auch gebrauchen können fehlt bei addMethod(static_cast<a href="IPluginInterface::Method" rel="nofollow">IPluginInterface::Method</a>(PScreenSaver::Rectangle)); vor dem PScreenSaver ein &amp;.</p>
<p>MFG<br />
xmarvel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/799785</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/799785</guid><dc:creator><![CDATA[xmarvel]]></dc:creator><pubDate>Tue, 31 May 2005 14:36:52 GMT</pubDate></item><item><title><![CDATA[Reply to Methode als Parameter on Tue, 31 May 2005 14:50:36 GMT]]></title><description><![CDATA[<p>Schön, daß es funktioniert (habe auch den obigen Code korrigiert, hatte ihn aus dem Kopf hingeschrieben).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/799798</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/799798</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Tue, 31 May 2005 14:50:36 GMT</pubDate></item></channel></rss>