<?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[Virtuelle Funktionen und Funktionen als Methodenrückgabe]]></title><description><![CDATA[<p>Hallo zusammen!</p>
<p>Ich versuche seit mehr als 4 Stunden eine Polynominterpolation in c++ zu programmieren, scheitere aber immer wieder an den Sprachelementen.</p>
<p>Könnt Ihr mir erklären, wie man folgendes java-konstrukt in c++ umsetzen kann?</p>
<pre><code class="language-java">interface Function {
  public double f(double array[], double x);
};
public class Test {
static Function getTheFunction() {
 Function bsp = new Function()
   {
     public double f(double array[], double x) {
           return x*x*2 + array[0];
     } /* f(x) */
   };
  return bsp;
}
static public void main(String[] args) {
   Function show = getTheFunction();
   System.out.println(show.f(new double[]{0.5}, 9));
 }
}
</code></pre>
<p>Beziehnungsweise, wie ich das umgehen kann. Ich hab es auch schon mit Pointer auf Klassen versucht, aber ich bekomme immer einen Segmentationfault. Was läuft da falsch?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Function {
	public:
		virtual double f(double *gitter, int dim, double x) = 0;
};
class LagrangeGrundpolynom : public virtual Function {
	public:
		double f(double *gitter, int dim, double x) {
			double p = 0; 
				for(int i = 0; i &lt; dim; i ++)
					p += gitter[i] * x;
			return p;
		};
};
int main() {

double gitter[10] = {1,2,3,4,5,6,7,8,9,10};
LagrangeGrundpolynom *lg = new LagrangeGrundpolynom();
cout &lt;&lt; lg-&gt;f(gitter,10,3) &lt;&lt; endl;
}
</code></pre>
<p><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="😕"
    /><br />
Ich freue mich auf fachkundigen Rat!</p>
<p>Mit vielen Grüßen!<br />
Roland</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/259158/virtuelle-funktionen-und-funktionen-als-methodenrückgabe</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 22:19:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/259158.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 19 Jan 2010 19:16:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Virtuelle Funktionen und Funktionen als Methodenrückgabe on Tue, 19 Jan 2010 19:16:23 GMT]]></title><description><![CDATA[<p>Hallo zusammen!</p>
<p>Ich versuche seit mehr als 4 Stunden eine Polynominterpolation in c++ zu programmieren, scheitere aber immer wieder an den Sprachelementen.</p>
<p>Könnt Ihr mir erklären, wie man folgendes java-konstrukt in c++ umsetzen kann?</p>
<pre><code class="language-java">interface Function {
  public double f(double array[], double x);
};
public class Test {
static Function getTheFunction() {
 Function bsp = new Function()
   {
     public double f(double array[], double x) {
           return x*x*2 + array[0];
     } /* f(x) */
   };
  return bsp;
}
static public void main(String[] args) {
   Function show = getTheFunction();
   System.out.println(show.f(new double[]{0.5}, 9));
 }
}
</code></pre>
<p>Beziehnungsweise, wie ich das umgehen kann. Ich hab es auch schon mit Pointer auf Klassen versucht, aber ich bekomme immer einen Segmentationfault. Was läuft da falsch?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Function {
	public:
		virtual double f(double *gitter, int dim, double x) = 0;
};
class LagrangeGrundpolynom : public virtual Function {
	public:
		double f(double *gitter, int dim, double x) {
			double p = 0; 
				for(int i = 0; i &lt; dim; i ++)
					p += gitter[i] * x;
			return p;
		};
};
int main() {

double gitter[10] = {1,2,3,4,5,6,7,8,9,10};
LagrangeGrundpolynom *lg = new LagrangeGrundpolynom();
cout &lt;&lt; lg-&gt;f(gitter,10,3) &lt;&lt; endl;
}
</code></pre>
<p><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="😕"
    /><br />
Ich freue mich auf fachkundigen Rat!</p>
<p>Mit vielen Grüßen!<br />
Roland</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1841603</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1841603</guid><dc:creator><![CDATA[fromjavatocpp]]></dc:creator><pubDate>Tue, 19 Jan 2010 19:16:23 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Funktionen und Funktionen als Methodenrückgabe on Tue, 19 Jan 2010 19:29:47 GMT]]></title><description><![CDATA[<p>Was du machst, ist Java in C++ zu programmieren. C++ bietet aber andere Konzepte. Zum einen besteht nicht die einzige Möglichkeit für Callback-Mechanismen in polymorphen Objekten, zum anderen muss man angeforderten Speicher wieder freigeben.</p>
<p>Spricht in deinem Falle etwas gegen normale Funktoren, die den <code>operator()</code> überladen, oder sogar Funktionszeiger?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1841612</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1841612</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 19 Jan 2010 19:29:47 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Funktionen und Funktionen als Methodenrückgabe on Tue, 19 Jan 2010 20:19:27 GMT]]></title><description><![CDATA[<p>Den segfault kann ich nicht nachvollziehen (auch valgrind spuckt nichts aus), aber du leckst am Ende Speicher (lg wird nicht freigegeben).</p>
<p>Wie dem auch sei, man finge das ganze in C++ auf ganz andere Weise an. In einem einfachen Fall wie diesem täte es wohl ein Funktionszeiger, etwa</p>
<pre><code class="language-cpp">#include &lt;cstddef&gt;
#include &lt;iostream&gt;

typedef double (*function_t)(int const *gitter, std::size_t dim, double x);

double langrange_grundpolynom(int const *gitter, std::size_t dim, double x) {
  double p = 0;
  for(int i = 0; i &lt; dim; ++i) {
    p += gitter[i] * x;
  }

  return p;
}

int main() {
  double gitter[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
  function_t func = lagrange_grundpolynom;

  std::cout &lt;&lt; func(gitter, 10, 3) &lt;&lt; std::endl;
}
</code></pre>
<p>Wenn komplexere Zusammenhänge gewünscht sind, beispielsweise Funktionsobjekte mit eigenem Status, wäre folgendes sinnvoll (Aktueller Compiler vorausgesetzt):</p>
<pre><code class="language-cpp">#include &lt;cstddef&gt;
#include &lt;iostream&gt;
#include &lt;tr1/functional&gt;

typedef std::tr1::function&lt;double(double const *gitter, std::size_t dim)&gt; function_t;

class lagrange_grundpolynom {
public:
  lagrange_grundpolynom(double x);

  double operator()(double const *gitter, std::size_t dim) const;

  double x_;
};

lagrange_grundpolynom::lagrange_grundpolynom(double x) : x_(x) { }

double lagrange_grundpolynom::operator()(double const *gitter, std::size_t dim) const {
  double p = 0;
  for(int i = 0; i &lt; dim; ++i) {
    p += gitter[i] * x_;
  }

  return p;
}

int main() {
  double gitter[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

  function_t func = lagrange_grundpolynom(3);

  std::cout &lt;&lt; func(gitter, 10) &lt;&lt; std::endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1841646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1841646</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Tue, 19 Jan 2010 20:19:27 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Funktionen und Funktionen als Methodenrückgabe on Wed, 20 Jan 2010 18:22:18 GMT]]></title><description><![CDATA[<blockquote>
<p>Was du machst, ist Java in C++ zu programmieren.</p>
</blockquote>
<p>Das stimmt ^^.</p>
<p>Danke euch beiden für die Tips: Ich habe tatsächlich noch nie typedef benutzt, sprich gar nicht gewusst, was es ist.</p>
<p>Danke seldon für das Beispiel! Es funktioniert wunderbar und macht sozusagen genau das, was ich bewirken wollte.</p>
<p>Zwei kleine Fragen noch:<br />
°Was macht die cstddef?<br />
°Habt ihr einen Tipp für mich, wo ich alle c++ Standartbibliotheken durchforsten kann?</p>
<p>Beste Grüße!<br />
Roland</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1842168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1842168</guid><dc:creator><![CDATA[fromjavatocpp]]></dc:creator><pubDate>Wed, 20 Jan 2010 18:22:18 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Funktionen und Funktionen als Methodenrückgabe on Wed, 20 Jan 2010 18:32:17 GMT]]></title><description><![CDATA[<p>fromjavatocpp schrieb:</p>
<blockquote>
<p>°Habt ihr einen Tipp für mich, wo ich alle c++ Standartbibliotheken durchforsten kann?</p>
</blockquote>
<p>Das ist sehr viel drin:<br />
<a href="http://www.cplusplus.com/reference/" rel="nofollow">http://www.cplusplus.com/reference/</a></p>
<p>Alternativ ein gutes Buch (siehe FAQ) oder das ultimative Nachschalgewerk ist natürlich der Standard. <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="😉"
    /> (aber eher weniger zum lernen zu empfehlen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1842175</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1842175</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 20 Jan 2010 18:32:17 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Funktionen und Funktionen als Methodenrückgabe on Thu, 21 Jan 2010 17:42:50 GMT]]></title><description><![CDATA[<p>Ich würde dir auch unbedingt empfehlen, ein C++-Buch zuzulegen. Auch wenn C++ auf den ersten Blick ähnlich wie Java aussieht, werden komplett andere Konzepte verfolgt. Zum einen liegt der Schwerpunkt weniger auf Objektorientierung (C++ wird oft als Multi-Paradigmen-Sprache bezeichnet), zum anderen gibt es etliche Sprachmittel, die vorsichtiger zu handhaben sind. Das heisst, bei <code>new</code> musst du den Speicher wieder selbst freigeben (kein GC), Arrays prüfen ihre Indizes nicht automatisch und auch sonst gibt es sehr viele beachtenswerte Dinge wie z.B. Zeiger, oder grundsätzliche Wertsemantik.</p>
<p>Keine Angst, man kann in C++ sehr gut von Low-Level-Operationen wie Speicherverwaltung abstrahieren, du musst dich also nicht wie in C ständig mit solchen Dingen rumschlagen. <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/1842799</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1842799</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 21 Jan 2010 17:42:50 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Funktionen und Funktionen als Methodenrückgabe on Thu, 21 Jan 2010 18:33:31 GMT]]></title><description><![CDATA[<p>&lt;cstddef&gt; definiert ein paar Typen und Makros, die häufig bis gelegentlich gebraucht werden - NULL, offsetof, std::size_t und std::ptrdiff_t. In diesem Fall habe ich std::size_t benutzt, also brauchte ich &lt;cstddef&gt;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1842820</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1842820</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Thu, 21 Jan 2010 18:33:31 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Funktionen und Funktionen als Methodenrückgabe on Thu, 21 Jan 2010 18:54:37 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>&lt;cstddef&gt; ...</p>
</blockquote>
<p>Habe zumindest ich noch nie direkt includiert. Die einzigen C-Kompatibilitätsheader die ich in den letzten 2 Jahren aktiv verwendet habe sind &lt;cassert&gt; und &lt;cmath&gt;. Ich gestehe aber ein das ich NULL und std::size_t schon verwendet habe (nur werden die wohl indirekt eingebunden).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1842826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1842826</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 21 Jan 2010 18:54:37 GMT</pubDate></item></channel></rss>