<?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[Problem mit Funktor]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hätte einmal eine Frage zu Funktoren:</p>
<p>Ich habe eine Klasse EFeld, welche die Feldstärke eines elektrischen Feldes berechnen soll:</p>
<pre><code class="language-cpp">-&gt;Gesamtflaeche = qsimp(std::mem_fun(SQE), STARTPUNKT, -STARTPUNKT, 1.0E-16);

double Efeld::SQE(double time)
{
	double Wert = (*this)(time);
	return Wert*Wert;
}

double Efeld::operator()(double time)
{
	double E = 0;
	for (int i=0; i&lt; AnzahlGause; i++)
		E += amplitude[i]*exp(-((time-point[i])/width[i])*((time-point[i])/width[i]))*cos(ofreq[i]*time + phase[i]);

	E=E/Gesamtflaeche*Referenzflaeche*Koeffizient;

	return E;		
}
</code></pre>
<p>Die Klasse selber müsste also schon ein Funktor sein, da der operator () überschrieben worden ist. Jetzt soll die Gesamtfläche unter dem Graphen (Efeld^2 über Zeit aufgetragen) mit qsimp berechnet werden. qsimp ist eine Methode zur numerischen Integration und erwartet einen Funktor, der die Funktion an entsprechenden Stellen ausgibt. Dieses soll die Funktion SQE machen, allerdings übersetzt der Compiler diesen Code nicht, er sagt:</p>
<blockquote>
<p>error C3867: &quot;Efeld::SQE&quot;: Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie &quot;&amp;Efeld::SQE&quot;, um einen Zeiger auf den Member zu erstellen.</p>
</blockquote>
<p>Wenn ich das aber doch so mache, dann ist die Methode SQE gar nicht mehr an diese E-Feld-Instanz gebunden (die Klasse kann ja verschiedene E-Felder erzeugen, je nach eingelesenen Parametern). Wie kann ich erreichen, dass qsimp wirklich die Funktion von der Instanz aufruft, die auch wirklich qsimp selber aufruft?</p>
<p>Vielen Dank für eine Antwort,</p>
<p>viele Grüße</p>
<p>Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/267707/problem-mit-funktor</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 07:51:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/267707.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 28 May 2010 17:26:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Funktor on Fri, 28 May 2010 17:26:33 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hätte einmal eine Frage zu Funktoren:</p>
<p>Ich habe eine Klasse EFeld, welche die Feldstärke eines elektrischen Feldes berechnen soll:</p>
<pre><code class="language-cpp">-&gt;Gesamtflaeche = qsimp(std::mem_fun(SQE), STARTPUNKT, -STARTPUNKT, 1.0E-16);

double Efeld::SQE(double time)
{
	double Wert = (*this)(time);
	return Wert*Wert;
}

double Efeld::operator()(double time)
{
	double E = 0;
	for (int i=0; i&lt; AnzahlGause; i++)
		E += amplitude[i]*exp(-((time-point[i])/width[i])*((time-point[i])/width[i]))*cos(ofreq[i]*time + phase[i]);

	E=E/Gesamtflaeche*Referenzflaeche*Koeffizient;

	return E;		
}
</code></pre>
<p>Die Klasse selber müsste also schon ein Funktor sein, da der operator () überschrieben worden ist. Jetzt soll die Gesamtfläche unter dem Graphen (Efeld^2 über Zeit aufgetragen) mit qsimp berechnet werden. qsimp ist eine Methode zur numerischen Integration und erwartet einen Funktor, der die Funktion an entsprechenden Stellen ausgibt. Dieses soll die Funktion SQE machen, allerdings übersetzt der Compiler diesen Code nicht, er sagt:</p>
<blockquote>
<p>error C3867: &quot;Efeld::SQE&quot;: Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie &quot;&amp;Efeld::SQE&quot;, um einen Zeiger auf den Member zu erstellen.</p>
</blockquote>
<p>Wenn ich das aber doch so mache, dann ist die Methode SQE gar nicht mehr an diese E-Feld-Instanz gebunden (die Klasse kann ja verschiedene E-Felder erzeugen, je nach eingelesenen Parametern). Wie kann ich erreichen, dass qsimp wirklich die Funktion von der Instanz aufruft, die auch wirklich qsimp selber aufruft?</p>
<p>Vielen Dank für eine Antwort,</p>
<p>viele Grüße</p>
<p>Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1903844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903844</guid><dc:creator><![CDATA[Andreas_L]]></dc:creator><pubDate>Fri, 28 May 2010 17:26:33 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Funktor on Fri, 28 May 2010 19:13:53 GMT]]></title><description><![CDATA[<p>-.-</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1903879</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903879</guid><dc:creator><![CDATA[Zeus]]></dc:creator><pubDate>Fri, 28 May 2010 19:13:53 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Funktor on Sat, 29 May 2010 05:50:07 GMT]]></title><description><![CDATA[<blockquote>
<p>Wenn ich das aber doch so mache, dann ist die Methode SQE gar nicht mehr an diese E-Feld-Instanz gebunden (die Klasse kann ja verschiedene E-Felder erzeugen, je nach eingelesenen Parametern).</p>
</blockquote>
<p>operator() braucht natürlich eine Instanz. Wie jeder operator ist das eine ganz normale Funktion, und wenn kein static davor steht brauchst du immer ein Objekt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1903969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903969</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Sat, 29 May 2010 05:50:07 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Funktor on Sat, 29 May 2010 09:33:16 GMT]]></title><description><![CDATA[<p>l'abra d'or schrieb:</p>
<blockquote>
<p>und wenn kein static davor steht brauchst du immer ein Objekt.</p>
</blockquote>
<p>Können Operatoren auch ein static vorne dran haben? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1904017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1904017</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 29 May 2010 09:33:16 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Funktor on Sat, 29 May 2010 10:19:35 GMT]]></title><description><![CDATA[<p>daersc schrieb:</p>
<blockquote>
<p>l'abra d'or schrieb:</p>
<blockquote>
<p>und wenn kein static davor steht brauchst du immer ein Objekt.</p>
</blockquote>
<p>Können Operatoren auch ein static vorne dran haben? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
</blockquote>
<p>Eigentlich war das mit dem static allgemein auf Member-Funktionen bezogen. Wenn kein static, dann wird ein Objekt benötigt.<br />
Übrigens ist ein &quot;static&quot; bei operator new/operator delete AFAIK Pflicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1904038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1904038</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Sat, 29 May 2010 10:19:35 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Funktor on Sat, 29 May 2010 10:52:33 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>erstmal vielen Dank für die Antwort.<br />
Allerdings habe ich das leider noch nicht ganz verstanden:</p>
<pre><code class="language-cpp">Efeld::Efeld(char* Dateiname)
{
	read_pulse_params(Dateiname);

	Gesamtflaeche = qsimp(std::mem_fun(this-&gt;SQE), STARTPUNKT, -STARTPUNKT, 1.0E-16);
}
double Efeld::SQE(double time)
{
    double Wert = (*this)(time);
    return Wert*Wert;
}

double Efeld::operator()(double time)
{
    double E = 0;
    for (int i=0; i&lt; AnzahlGause; i++)
        E += amplitude[i]*exp(-((time-point[i])/width[i])*((time-point[i])/width[i]))*cos(ofreq[i]*time + phase[i]);

    E=E/Gesamtflaeche*Referenzflaeche*Koeffizient;

    return E;        
}
</code></pre>
<p>Jetzt versuche ich mem_fun ja die Funktion der aufrufenden Instanz zu übergeben, allerdings erscheint immer noch der Fehler:</p>
<blockquote>
<p>error C3867: &quot;Efeld::SQE&quot;: Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie &quot;&amp;Efeld::SQE&quot;, um einen Zeiger auf den Member zu erstellen.</p>
</blockquote>
<p>Der Fehler bezieht sich auf die Zeile mit qsimp.</p>
<p>Was habe ich falsch verstanden - was muss ich noch ändern, damit es endlich klappt?</p>
<p>Vielen Dank für eine Antwort,</p>
<p>viele Grüße</p>
<p>Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1904050</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1904050</guid><dc:creator><![CDATA[Andreas_L]]></dc:creator><pubDate>Sat, 29 May 2010 10:52:33 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Funktor on Sat, 29 May 2010 11:58:30 GMT]]></title><description><![CDATA[<p>l'abra d'or schrieb:</p>
<blockquote>
<p>Übrigens ist ein &quot;static&quot; bei operator new/operator delete AFAIK Pflicht.</p>
</blockquote>
<p>Man darf es auch weglassen, die Methoden sind aber dennoch <code>static</code> . Ich würde es deshalb immer hinschreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1904070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1904070</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 29 May 2010 11:58:30 GMT</pubDate></item></channel></rss>