<?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[Funktionsobjekte]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte für die Suche nach Nullstellen einer bestimmten Funktion verschiedene Algorithmen (Bisection, Ridder's Method, Brent's Algorithm, usw) verwenden. Zu diesem Zweck will ich Funktionsobjekte in Verbindung mit dem Strategy-Pattern einsetzen, d.h. ich will das Kontext-Objekt mit einem bestimmten Algorithmus &quot;konfigurieren&quot;.</p>
<p>Nun zu meiner Frage? Ist die Verwendung von Funktionsobjekten performant oder sollte ich lieber Funktionspointer verwenden? Wie würdet ihr die Sache angehen?</p>
<p>Hier mein Ansatz (auszugsweise):</p>
<pre><code class="language-cpp">// Spezielle Funktion, für welche die Nullstellen ermittelt
// werden sollen.
class Function
{
 public:
        float operator()(float x);
};

// Abstrakte Basisklasse fuer die Algorithmen.
class RootFinding
{
 protected:
        Function m_function;
 public:
	virtual float find(void) = 0;
};

// Konkreter Algorithmus zur Nullstellensuche.
class Bisection : public RootFinding
{
 public:
        Bisection(float, float, float, Function);
        virtual float find(void);
};
</code></pre>
<p>Dann hätte ich da noch eine Frage: Natürlich würde ich gern in der abstrakten Basisklasse lieber eine Referenzvariable halten (Function&amp; m_function). Dies setzt natürlich voraus, dass die Initialisierung per Initialisierungsliste vollzogen wird. Doch wie mache ich das dann in der abgeleiteten Klasse mit der Initialisierung der Referenzvariable der Basisklasse?</p>
<p>Vielen Dank für die Hilfe</p>
<p>Toru</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/173878/funktionsobjekte</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 13:56:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/173878.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 20 Feb 2007 19:14:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktionsobjekte on Tue, 20 Feb 2007 19:16:58 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte für die Suche nach Nullstellen einer bestimmten Funktion verschiedene Algorithmen (Bisection, Ridder's Method, Brent's Algorithm, usw) verwenden. Zu diesem Zweck will ich Funktionsobjekte in Verbindung mit dem Strategy-Pattern einsetzen, d.h. ich will das Kontext-Objekt mit einem bestimmten Algorithmus &quot;konfigurieren&quot;.</p>
<p>Nun zu meiner Frage? Ist die Verwendung von Funktionsobjekten performant oder sollte ich lieber Funktionspointer verwenden? Wie würdet ihr die Sache angehen?</p>
<p>Hier mein Ansatz (auszugsweise):</p>
<pre><code class="language-cpp">// Spezielle Funktion, für welche die Nullstellen ermittelt
// werden sollen.
class Function
{
 public:
        float operator()(float x);
};

// Abstrakte Basisklasse fuer die Algorithmen.
class RootFinding
{
 protected:
        Function m_function;
 public:
	virtual float find(void) = 0;
};

// Konkreter Algorithmus zur Nullstellensuche.
class Bisection : public RootFinding
{
 public:
        Bisection(float, float, float, Function);
        virtual float find(void);
};
</code></pre>
<p>Dann hätte ich da noch eine Frage: Natürlich würde ich gern in der abstrakten Basisklasse lieber eine Referenzvariable halten (Function&amp; m_function). Dies setzt natürlich voraus, dass die Initialisierung per Initialisierungsliste vollzogen wird. Doch wie mache ich das dann in der abgeleiteten Klasse mit der Initialisierung der Referenzvariable der Basisklasse?</p>
<p>Vielen Dank für die Hilfe</p>
<p>Toru</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1232219</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1232219</guid><dc:creator><![CDATA[Toru]]></dc:creator><pubDate>Tue, 20 Feb 2007 19:16:58 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsobjekte on Tue, 20 Feb 2007 22:11:23 GMT]]></title><description><![CDATA[<p>Toru schrieb:</p>
<blockquote>
<p>Nun zu meiner Frage? Ist die Verwendung von Funktionsobjekten performant oder sollte ich lieber Funktionspointer verwenden? Wie würdet ihr die Sache angehen?</p>
</blockquote>
<p>Funktionsobjekte können theoretisch performanter sein, da der Compiler bessere Optimierungsmöglichkeiten hat (inline), langsamer sind sie sicher nicht.</p>
<p>Toru schrieb:</p>
<blockquote>
<p>Dann hätte ich da noch eine Frage: Natürlich würde ich gern in der abstrakten Basisklasse lieber eine Referenzvariable halten (Function&amp; m_function).</p>
</blockquote>
<p>Warum?</p>
<p>Toru schrieb:</p>
<blockquote>
<p>Dies setzt natürlich voraus, dass die Initialisierung per Initialisierungsliste vollzogen wird. Doch wie mache ich das dann in der abgeleiteten Klasse mit der Initialisierung der Referenzvariable der Basisklasse?</p>
</blockquote>
<p>das ist kein Problem. Du übergibst das Funktionsobjekt im Konstruktor und reichst es an die Basisklasse durch. Also etwa so:</p>
<pre><code class="language-cpp">// Spezielle Funktion, für welche die Nullstellen ermittelt
// werden sollen.
class Function
{
public:
    float operator()(float x); // const ?
};

// Abstrakte Basisklasse fuer die Algorithmen.
class RootFinding
{
protected:
    RootFinding( Function&amp; f )
        : m_function( f )
    {}
    Function&amp; m_function; // const Function&amp; ?
public:
    virtual float find(void) = 0;
};

// Konkreter Algorithmus zur Nullstellensuche.
class Bisection : public RootFinding
{
public:
    Bisection( float, float, float, Function&amp; f )
        : RootFinding( f )   // &lt;- hier Funktionsobjekt durchreichen
        // , weitere Member initialisieren
    {}
    virtual float find(void);
};
</code></pre>
<p>BTW.: was ist der Unterschied zwischen 'Ridder's Method' und 'Regula Falsi'?</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1232331</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1232331</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 20 Feb 2007 22:11:23 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsobjekte on Wed, 21 Feb 2007 17:53:20 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Toru schrieb:</p>
<blockquote>
<p>Dann hätte ich da noch eine Frage: Natürlich würde ich gern in der abstrakten Basisklasse lieber eine Referenzvariable halten (Function&amp; m_function).</p>
</blockquote>
<p>Warum?</p>
</blockquote>
<p>Ich mag keine Kopien. <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>Werner Salomon schrieb:</p>
<blockquote>
<p>BTW.: was ist der Unterschied zwischen 'Ridder's Method' und 'Regula Falsi'?</p>
</blockquote>
<p>Sicher hilft das hier weiter: <a href="http://www.nrbook.com/b/bookcpdf/c9-2.pdf" rel="nofollow">http://www.nrbook.com/b/bookcpdf/c9-2.pdf</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1232796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1232796</guid><dc:creator><![CDATA[Toru]]></dc:creator><pubDate>Wed, 21 Feb 2007 17:53:20 GMT</pubDate></item></channel></rss>