<?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[C++ default Konstruktor - private Variablen setzen?]]></title><description><![CDATA[<p>Hey,</p>
<p>arbeite zur Zeit an einem Projekt, dass Gleichungen parsed und dann ausrechnet. Das ganze passiert in Java mit Antlr4.</p>
<p>Jetzt ist hinzugekommen, dass man auch das Integral und die Ableitung berechnen lassen kann. Das ganze passiert in C++.</p>
<p>Ich habe also ein Java Functionsobjekt und übergebe das an eine native-Methode. Auf der &quot;C++-Seite&quot;, wrappe ich mir dann ein C++ Function Objekt mit dem ich die Ableitung bzw das Integral berechnen kann.</p>
<p>Die Headerdatei von &quot;JavaFunction&quot; sieht so aus:</p>
<pre><code>#ifndef JAVAFUNCTION_H_
#define JAVAFUNCTION_H_
#include &quot;jni.h&quot;
#include &quot;Function.h&quot;

class JavaFunction: public Function
{
private:
    JNIEnv *env;
    jobject instance;
    jmethodID fct;

public:
    JavaFunction(JNIEnv *env, jobject instance);
    ~JavaFunction()
    {
    }
    double operator()(double x) const
    {
        jdoubleArray position = env-&gt;NewDoubleArray(1);
        jdouble test[1];
        test[0]=x;
        env-&gt;SetDoubleArrayRegion(position,0,1,test);
        return env-&gt;CallDoubleMethod(instance, fct, position);
    }

}
;

#endif /* JAVAFUNCTION_H_ */
</code></pre>
<p>So, wenn ich auf der &quot;Java-Seite&quot; die Funktion &quot;differenziere&quot; aufrufe, komme ich in den JavaFunction.cpp Teil:</p>
<pre><code>JNIEXPORT jdouble JNICALL Java_de_lab4inf_wrb_Differentiator_differentiate
(JNIEnv *env, jobject unknown, jobject jfunction, jdouble value)
{

    jclass cls = env-&gt;FindClass(&quot;de/lab4inf/wrb/Funktionen&quot;);
    jmethodID midInit = env-&gt;GetMethodID(cls, &quot;eval&quot;, &quot;([D)D&quot;);

    JavaFunction f = JavaFunction(env, jfunction);
    f.env=env;
    f.instance=jfunction;
    f.fct=midInit;
    double result = 0;
    try
    {
        result = differentiate(f, value);
    }
    catch(const char* Error)
    {
    jclass exClass;

    exClass = env-&gt;FindClass(&quot;de/lab4inf/wrb/NumericException&quot;);
    return env-&gt;ThrowNew(exClass, Error );

    }
    return result;
}
</code></pre>
<p>Soo. Ich muss also irgendwie die private-Variablen setzen.<br />
Ich hab erst versucht, irgendwie mit default-Werten zu arbeiten im Konstruktor, dass er die übergebenen 2 Werte schonmal den Variablen zuweist.</p>
<p>Das gefällt dem Compiler aber alles nicht, sodass ich übergangsweise die Variablen auf public gesetzt habe und dann so zugewiesen habe wie es schon oben steht:</p>
<pre><code>f.env=env;
    f.instance=jfunction;
    f.fct=midInit;
</code></pre>
<p>Das ist aber eigentlich nicht Sinn der Sache. Da ich an der Uni noch keine Vorlesung zu C++ hatte, kenne ich mich in dem Gebiet absolut nicht aus.</p>
<p>Hoffe mir kann da jemand helfen,</p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/329789/c-default-konstruktor-private-variablen-setzen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Jul 2026 00:06:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/329789.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 08 Dec 2014 09:59:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to C++ default Konstruktor - private Variablen setzen? on Mon, 08 Dec 2014 09:59:36 GMT]]></title><description><![CDATA[<p>Hey,</p>
<p>arbeite zur Zeit an einem Projekt, dass Gleichungen parsed und dann ausrechnet. Das ganze passiert in Java mit Antlr4.</p>
<p>Jetzt ist hinzugekommen, dass man auch das Integral und die Ableitung berechnen lassen kann. Das ganze passiert in C++.</p>
<p>Ich habe also ein Java Functionsobjekt und übergebe das an eine native-Methode. Auf der &quot;C++-Seite&quot;, wrappe ich mir dann ein C++ Function Objekt mit dem ich die Ableitung bzw das Integral berechnen kann.</p>
<p>Die Headerdatei von &quot;JavaFunction&quot; sieht so aus:</p>
<pre><code>#ifndef JAVAFUNCTION_H_
#define JAVAFUNCTION_H_
#include &quot;jni.h&quot;
#include &quot;Function.h&quot;

class JavaFunction: public Function
{
private:
    JNIEnv *env;
    jobject instance;
    jmethodID fct;

public:
    JavaFunction(JNIEnv *env, jobject instance);
    ~JavaFunction()
    {
    }
    double operator()(double x) const
    {
        jdoubleArray position = env-&gt;NewDoubleArray(1);
        jdouble test[1];
        test[0]=x;
        env-&gt;SetDoubleArrayRegion(position,0,1,test);
        return env-&gt;CallDoubleMethod(instance, fct, position);
    }

}
;

#endif /* JAVAFUNCTION_H_ */
</code></pre>
<p>So, wenn ich auf der &quot;Java-Seite&quot; die Funktion &quot;differenziere&quot; aufrufe, komme ich in den JavaFunction.cpp Teil:</p>
<pre><code>JNIEXPORT jdouble JNICALL Java_de_lab4inf_wrb_Differentiator_differentiate
(JNIEnv *env, jobject unknown, jobject jfunction, jdouble value)
{

    jclass cls = env-&gt;FindClass(&quot;de/lab4inf/wrb/Funktionen&quot;);
    jmethodID midInit = env-&gt;GetMethodID(cls, &quot;eval&quot;, &quot;([D)D&quot;);

    JavaFunction f = JavaFunction(env, jfunction);
    f.env=env;
    f.instance=jfunction;
    f.fct=midInit;
    double result = 0;
    try
    {
        result = differentiate(f, value);
    }
    catch(const char* Error)
    {
    jclass exClass;

    exClass = env-&gt;FindClass(&quot;de/lab4inf/wrb/NumericException&quot;);
    return env-&gt;ThrowNew(exClass, Error );

    }
    return result;
}
</code></pre>
<p>Soo. Ich muss also irgendwie die private-Variablen setzen.<br />
Ich hab erst versucht, irgendwie mit default-Werten zu arbeiten im Konstruktor, dass er die übergebenen 2 Werte schonmal den Variablen zuweist.</p>
<p>Das gefällt dem Compiler aber alles nicht, sodass ich übergangsweise die Variablen auf public gesetzt habe und dann so zugewiesen habe wie es schon oben steht:</p>
<pre><code>f.env=env;
    f.instance=jfunction;
    f.fct=midInit;
</code></pre>
<p>Das ist aber eigentlich nicht Sinn der Sache. Da ich an der Uni noch keine Vorlesung zu C++ hatte, kenne ich mich in dem Gebiet absolut nicht aus.</p>
<p>Hoffe mir kann da jemand helfen,</p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2431731</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2431731</guid><dc:creator><![CDATA[SebRpi]]></dc:creator><pubDate>Mon, 08 Dec 2014 09:59:36 GMT</pubDate></item><item><title><![CDATA[Reply to C++ default Konstruktor - private Variablen setzen? on Mon, 08 Dec 2014 10:09:46 GMT]]></title><description><![CDATA[<p>Das Zauberwort heißt &quot;Initialisierungsliste&quot;</p>
<pre><code class="language-cpp">JavaFunction(JNIEnv *env, jobject instance)
: env(env),
  instance(instance)
{}
</code></pre>
<p>In der Initialisierungsliste werden Membervariablen initialisiert. Achtung: moderne Compiler sollten die Namenskollision (Membername = Parametername) eigentlich auflösen können. Falls du trotzdem Fehlermeldungen bekommst, benenne da mal was um (bspw. einen Unterstrich an die Parameternamen ranhängen).</p>
<p>SebRpi schrieb:</p>
<blockquote>
<p>Da ich an der Uni noch keine Vorlesung zu C++ hatte, kenne ich mich in dem Gebiet absolut nicht aus.</p>
</blockquote>
<p>Bei dem Code, der hier teilweise als &quot;vom Prof vorgegeben&quot; präsentiert wird, muss das nicht unbedingt ein Nachteil sein <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/2431734</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2431734</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Mon, 08 Dec 2014 10:09:46 GMT</pubDate></item><item><title><![CDATA[Reply to C++ default Konstruktor - private Variablen setzen? on Mon, 08 Dec 2014 10:40:29 GMT]]></title><description><![CDATA[<p>Danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Hab jetzt einfach auch die 3. Variable mit in den Konstruktor reingenommen und gesetzt. Klappt jetzt alles.</p>
<p>Danke nochmal <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2431743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2431743</guid><dc:creator><![CDATA[SebRpi]]></dc:creator><pubDate>Mon, 08 Dec 2014 10:40:29 GMT</pubDate></item></channel></rss>