<?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[Funktionszeiger auf Memberfunktion]]></title><description><![CDATA[<p>Hallo allerseits,<br />
ich habe folgendes Problem:<br />
In einer Methode einer Klasse die ein Gleichungssystem repräsentiert möchte ich eine Funktion zur Lösung des Gleichungssystems aufrufen. Diese Funktion benötigt einen Funktionspointer auf eine Methode meiner Gleichungssystem-Klasse. Ich hab meinen Ansatz mal schematisch gecoded.</p>
<pre><code class="language-cpp">class Gleichungssystem
{
    Vec anfangswert;

    void Wert(Vec &amp;in, Vec &amp;out);

    void Solve();
}

Gleichungssystem::Solve()
{
    Lösungsverfahren(this-&gt;Wert)
}
</code></pre>
<p>nun die Frage: kann es sein daß ich eine Memberfunktion nicht per Funktionspointer übergeben kann, weil dann die beziehung zum speziellen Objekt verloren geht?<br />
und falls ja, wie würdet ihr das Problem lösen?</p>
<p>Vielen dank im voraus,<br />
Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/187426/funktionszeiger-auf-memberfunktion</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 20:37:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/187426.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 19 Jul 2007 13:33:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktionszeiger auf Memberfunktion on Thu, 19 Jul 2007 13:33:55 GMT]]></title><description><![CDATA[<p>Hallo allerseits,<br />
ich habe folgendes Problem:<br />
In einer Methode einer Klasse die ein Gleichungssystem repräsentiert möchte ich eine Funktion zur Lösung des Gleichungssystems aufrufen. Diese Funktion benötigt einen Funktionspointer auf eine Methode meiner Gleichungssystem-Klasse. Ich hab meinen Ansatz mal schematisch gecoded.</p>
<pre><code class="language-cpp">class Gleichungssystem
{
    Vec anfangswert;

    void Wert(Vec &amp;in, Vec &amp;out);

    void Solve();
}

Gleichungssystem::Solve()
{
    Lösungsverfahren(this-&gt;Wert)
}
</code></pre>
<p>nun die Frage: kann es sein daß ich eine Memberfunktion nicht per Funktionspointer übergeben kann, weil dann die beziehung zum speziellen Objekt verloren geht?<br />
und falls ja, wie würdet ihr das Problem lösen?</p>
<p>Vielen dank im voraus,<br />
Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1328564</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1328564</guid><dc:creator><![CDATA[HerrLatz]]></dc:creator><pubDate>Thu, 19 Jul 2007 13:33:55 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger auf Memberfunktion on Thu, 19 Jul 2007 13:37:19 GMT]]></title><description><![CDATA[<p>HerrLatz schrieb:</p>
<blockquote>
<p>nun die Frage: kann es sein daß ich eine Memberfunktion nicht per Funktionspointer übergeben kann, weil dann die beziehung zum speziellen Objekt verloren geht?</p>
</blockquote>
<p>Ja, das kann nicht nur so sein, das IST so.</p>
<blockquote>
<p>und falls ja, wie würdet ihr das Problem lösen?</p>
</blockquote>
<p>Methodenzeiger verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1328573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1328573</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 19 Jul 2007 13:37:19 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger auf Memberfunktion on Thu, 19 Jul 2007 13:39:26 GMT]]></title><description><![CDATA[<p>Schau dir das mal an:<br />
<a href="http://www.boost.org/doc/html/function.html" rel="nofollow">http://www.boost.org/doc/html/function.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1328577</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1328577</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Thu, 19 Jul 2007 13:39:26 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger auf Memberfunktion on Thu, 19 Jul 2007 13:42:33 GMT]]></title><description><![CDATA[<p>Kann man eigentlich nen Methodenzeiger in nen Funktionszeiger &quot;casten&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1328583</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1328583</guid><dc:creator><![CDATA[mal so]]></dc:creator><pubDate>Thu, 19 Jul 2007 13:42:33 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger auf Memberfunktion on Thu, 19 Jul 2007 14:38:27 GMT]]></title><description><![CDATA[<p>mal so schrieb:</p>
<blockquote>
<p>Kann man eigentlich nen Methodenzeiger in nen Funktionszeiger &quot;casten&quot;?</p>
</blockquote>
<p>Was bringts dir?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1328647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1328647</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Thu, 19 Jul 2007 14:38:27 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger auf Memberfunktion on Thu, 19 Jul 2007 14:57:28 GMT]]></title><description><![CDATA[<p>mal so schrieb:</p>
<blockquote>
<p>Kann man eigentlich nen Methodenzeiger in nen Funktionszeiger &quot;casten&quot;?</p>
</blockquote>
<p>Man kann zwar viel böse rumcasten, aber das würde der Compiler IMHO in jedem denkbaren Fall verhindern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1328663</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1328663</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 19 Jul 2007 14:57:28 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger auf Memberfunktion on Thu, 19 Jul 2007 18:00:09 GMT]]></title><description><![CDATA[<p>HerrLatz schrieb:</p>
<blockquote>
<p>...kann es sein daß ich eine Memberfunktion nicht per Funktionspointer übergeben kann, weil dann die beziehung zum speziellen Objekt verloren geht?...</p>
</blockquote>
<p><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="👍"
    /><br />
Also ich finde es super, dass Du da alleine drauf gekommen bist ! (ganz ernst gemeint)<br />
In fast allen anderen Threads zu diesem Thema liegt der Grund genau darin, dass die Leute diesen Zusammenhang nicht beachtet haben.</p>
<p>Als mögliche &quot;Lösungen&quot; Zu Deinem Beispiel fallen mir ein: Lösungsverfahren() nimmt als Parameter</p>
<ul>
<li>ein &quot;Gleichungssystem&quot; oder</li>
<li>eine gemeinsame Basisklasses (z.B. <code>class hasWertFunktion</code> ) oder</li>
<li>einen Funktor</li>
</ul>
<p>entgegen.<br />
Zum Letzten:</p>
<pre><code class="language-cpp">void Loesungsverfahren(void (*)(Vec&amp;, Vec&amp;));

struct Gleichungssystem
{
    Vec anfangswert;

    void Wert(Vec &amp;in, Vec &amp;out);

    void Solve();
}

struct Wert_Funktion {
   Gleichungssystem&amp; g;
   Wert_Funktion(Gleichungssystem&amp; bezug) : g(bezug) {}
   void operator()(Vec &amp;in, Vec &amp;out) { g.Wert(in, out); }
};

Gleichungssystem::Solve()
{
   Wert_Funktion  wf(*this);
   Loesungsverfahren(wf);
}
</code></pre>
<p>Der Funktor &quot;Wert_Funktion&quot; &quot;merkt&quot; sich also den Bezug zum Objekt.</p>
<p>Gruß,</p>
<p>Simon2.</p>
<p>P.S.: Den Zugriff auf Klassenmember mittels &quot;this-&gt;&quot; finde ich unübersichtlich, überflüssig und &quot;de-flexibilisierend&quot;. <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/1328777</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1328777</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 19 Jul 2007 18:00:09 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger auf Memberfunktion on Thu, 19 Jul 2007 21:34:44 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13624">@Simon2</a>: Hmmm. Die Funktion Loesungsverfahren nimmt einen Funktionszeiger entgegen, und Du gibst ihm einen Funktor.</p>
<p>Eine mögliche Lösung (ohne tr1) wäre, den Funktor als Template zu realisieren. Wenn die Signatur nicht stimmt, wird sich der Compiler schon beschweren <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>
<pre><code class="language-cpp">template&lt;typename Func&gt;
void Loesungsverfahren(Func f)
{
// hier f als funktion nutzen
    f(x,y);
}

struct Gleichungssystem
{
    Vec anfangswert;

    void Wert(Vec &amp;in, Vec &amp;out);

    void Solve();
};

struct Wert_Funktion {
    Gleichungssystem&amp; g;
    Wert_Funktion(Gleichungssystem&amp; bezug) : g(bezug) {}
    void operator()(Vec &amp;in, Vec &amp;out) { g.Wert(in, out); }
};

void Gleichungssystem::Solve()
{
    Wert_Funktion  wf(*this);
    Loesungsverfahren(wf);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1328888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1328888</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 19 Jul 2007 21:34:44 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger auf Memberfunktion on Fri, 20 Jul 2007 07:22:15 GMT]]></title><description><![CDATA[<p>Wow, auf jeden Fall vielen Dank für die vielen Antworten.<br />
Das Lösungsverfahren liegt im Quellcode vor, insofern kann ich das schon verändern. Ich wollte es zwar ursprünglich lassen wie es ist, aber ich vermute so geht es einfacher.<br />
Im Moment ist meine präferierte Lösung das übergeben einer Basisklasse, da ich so keinen Zirkelbezug bekomme. Den Begriff Funktor habe ich heute zum ersten mal gehört und nicht viel dazu im Netz gefunden. Das hier war zwar interessant, hat aber wenig weitergeholfen:<br />
<a href="http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht16Ht/formal_funktor_de" rel="nofollow">Funktor</a><br />
Werde aber noch ein wenig rumschaun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1328979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1328979</guid><dc:creator><![CDATA[Herr Latz]]></dc:creator><pubDate>Fri, 20 Jul 2007 07:22:15 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger auf Memberfunktion on Fri, 20 Jul 2007 07:26:53 GMT]]></title><description><![CDATA[<p>Ja, die Seite redet ja auch nur ganz knapp über C++ Funktoren <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>
<p>Kurz zusammengefasst das wichtigste: Ein Funktor (oder Funktionsobjekt) ist ein Objekt, das wie eine Funktion verwendet werden kann. Das bedeutet letztendlich nur, daß die entsprechende Klasse den operator() überladen hat. (aber da sich dahinter ein vollwertiges Objekt befindet, ist ein Funktor um einiges mächtiger als eine normale Funktion).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1328982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1328982</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 20 Jul 2007 07:26:53 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger auf Memberfunktion on Fri, 20 Jul 2007 08:00:36 GMT]]></title><description><![CDATA[<p>Ok, jetzt hats geschnaklt. Das klingt eleganter als eine spezielle Basisklasse einzuführen.<br />
Vielen Dank euch allen,<br />
Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1329003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1329003</guid><dc:creator><![CDATA[HerrLatz]]></dc:creator><pubDate>Fri, 20 Jul 2007 08:00:36 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger auf Memberfunktion on Mon, 23 Jul 2007 14:50:33 GMT]]></title><description><![CDATA[<p>Ich bin jetzt den Weg mit dem Template gegangen. Das sieht dann in etwa so aus:</p>
<pre><code class="language-cpp">// Datei nr.h
template&lt;typename Func&gt;
void broydn(Func f);

// Datei broydn.cpp. Das ist das Lösungsverfahren.
include &quot;nr.h&quot;
template&lt;typename Func&gt;
void broydn(Func f)
{
// hier f als funktion nutzen
    f(x,y);
}

// Datei Gleichungssystem.h
#include &quot;nr.h&quot;
struct Gleichungssystem
{
    Vec anfangswert;

    void Wert(Vec &amp;in, Vec &amp;out);

    void Solve();
};

// Datei Gleichungssystem.cpp
struct Wert_Funktion {
    Gleichungssystem&amp; g;
    Wert_Funktion(Gleichungssystem&amp; bezug) : g(bezug) {}
    void operator()(Vec &amp;in, Vec &amp;out) { g.Wert(in, out); }
};

// Datei Gleichungssystem.cpp
void Gleichungssystem::Solve()
{
    Wert_Funktion  wf(*this);
    Loesungsverfahren(wf);
}
</code></pre>
<p>Jetzt bekomme ich aber folgenden Fehler:</p>
<pre><code>error LNK2019 unresolved external symbol &quot;void __cdecl broydn&lt;struct Wert_Funktion&gt;...
</code></pre>
<p>Jetzt hab ich irgendwie nicht so recht eine Ahnung woran das liegt. Kann mir da nochmal jemand auf die Sprünge helfen?<br />
Danke,<br />
Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1330900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1330900</guid><dc:creator><![CDATA[HerrLatz]]></dc:creator><pubDate>Mon, 23 Jul 2007 14:50:33 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger auf Memberfunktion on Mon, 23 Jul 2007 14:59:27 GMT]]></title><description><![CDATA[<p>HerrLatz schrieb:</p>
<blockquote>
<p>...</p>
<pre><code class="language-cpp">// Datei nr.h
template&lt;typename Func&gt;
void broydn(Func f);

// Datei broydn.cpp. Das ist das Lösungsverfahren.
include &quot;nr.h&quot;
template&lt;typename Func&gt;
void broydn(Func f)
{
// hier f als funktion nutzen
    f(x,y);
}
...
</code></pre>
</blockquote>
<p>Geht nicht !<br />
Der Compiler muss die Implementation eines templates sehen =&gt;</p>
<pre><code class="language-cpp">// Datei nr.h
template&lt;typename Func&gt;
void broydn(Func f)
{
// hier f als funktion nutzen
    f(x,y);
}
</code></pre>
<p>Ist übrigens der Standardfehler bei template-Anfängern <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>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1330906</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1330906</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 23 Jul 2007 14:59:27 GMT</pubDate></item></channel></rss>