C++ default Konstruktor - private Variablen setzen?



  • Hey,

    arbeite zur Zeit an einem Projekt, dass Gleichungen parsed und dann ausrechnet. Das ganze passiert in Java mit Antlr4.

    Jetzt ist hinzugekommen, dass man auch das Integral und die Ableitung berechnen lassen kann. Das ganze passiert in C++.

    Ich habe also ein Java Functionsobjekt und übergebe das an eine native-Methode. Auf der "C++-Seite", wrappe ich mir dann ein C++ Function Objekt mit dem ich die Ableitung bzw das Integral berechnen kann.

    Die Headerdatei von "JavaFunction" sieht so aus:

    #ifndef JAVAFUNCTION_H_
    #define JAVAFUNCTION_H_
    #include "jni.h"
    #include "Function.h"
    
    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->NewDoubleArray(1);
            jdouble test[1];
            test[0]=x;
            env->SetDoubleArrayRegion(position,0,1,test);
            return env->CallDoubleMethod(instance, fct, position);
        }
    
    }
    ;
    
    #endif /* JAVAFUNCTION_H_ */
    

    So, wenn ich auf der "Java-Seite" die Funktion "differenziere" aufrufe, komme ich in den JavaFunction.cpp Teil:

    JNIEXPORT jdouble JNICALL Java_de_lab4inf_wrb_Differentiator_differentiate
    (JNIEnv *env, jobject unknown, jobject jfunction, jdouble value)
    {
    
        jclass cls = env->FindClass("de/lab4inf/wrb/Funktionen");
        jmethodID midInit = env->GetMethodID(cls, "eval", "([D)D");
    
        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->FindClass("de/lab4inf/wrb/NumericException");
        return env->ThrowNew(exClass, Error );
    
        }
        return result;
    }
    

    Soo. Ich muss also irgendwie die private-Variablen setzen.
    Ich hab erst versucht, irgendwie mit default-Werten zu arbeiten im Konstruktor, dass er die übergebenen 2 Werte schonmal den Variablen zuweist.

    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:

    f.env=env;
        f.instance=jfunction;
        f.fct=midInit;
    

    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.

    Hoffe mir kann da jemand helfen,

    Grüße



  • Das Zauberwort heißt "Initialisierungsliste"

    JavaFunction(JNIEnv *env, jobject instance)
    : env(env),
      instance(instance)
    {}
    

    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).

    SebRpi schrieb:

    Da ich an der Uni noch keine Vorlesung zu C++ hatte, kenne ich mich in dem Gebiet absolut nicht aus.

    Bei dem Code, der hier teilweise als "vom Prof vorgegeben" präsentiert wird, muss das nicht unbedingt ein Nachteil sein 😉



  • Danke 🙂

    Hab jetzt einfach auch die 3. Variable mit in den Konstruktor reingenommen und gesetzt. Klappt jetzt alles.

    Danke nochmal 😛


Anmelden zum Antworten