Problem mit dynamischer Klasse in template Funktion



  • Hallo,

    ich habe eine Klasse, die eine zweidimensionale Matrix darstellen soll, mit templates erstellt.

    // Headerdatei von Matrixklasse
    //  matrix.h
    
    template <typename T>
    class MATRIX2D{
    protected:
    	vector< vector<T> > matrix;
    // weiterer Quelltext
    };
    

    In einer anderen Headerdatei habe ich eine Funktion, die diese Klasse als Zeiger benutzen soll:

    //Funktionsheader
    // funktion.h
    
    template <typename T>
    double eigene_interpolation(MATRIX2D<T>* values, const double gesucht, const double kriterium){
    // Quelltext
    }
    

    Nun möchte ich beide Sachen in einer anderen Klasse anwenden:

    // Klasse
    #include "matrix.h"
    #include "funktion.h"
    
    class anwenderklasse{
    private:
    MATRIX2D<double>* _Werte_m;
    // usw.
    
    public:
    anwenderklasse(){
    _Werte_m = new MATRIX2D<double>;
    return;
    // Mache damit etwas
    } // Ende Konstruktor
    
    void klassen_funktion(){
    // Quelltext
    double wert = eigene_interpolation(_Werte_m, 3, 10^(-6));
    // Quelltext
    }
    
    anwenderklasse(){
    delete ~_Werte_m;
    return;
    } // Ende Dekonstruktor
    };
    

    Die IDE Eclipse Indigo zeigt jetzt allerdings an:

    Multiple markers at this line
    - Invalid arguments ' Candidates are: double eigene_interpolation(? *, double, double) '

    Kann mir bitte einer erklären, was ich falsch mache bzw. nicht beachte?

    Ich habe schon die Schreibweise

    double wert = eigene_interpolation<double>(_Werte_m, 3, 10^(-6));
    

    erfolglos ausprobiert.

    Danke für Eure Hilfe

    Thomas



  • Entschuldige,

    falsches Forum

    Das sollte in's C++



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89, C99 und C11) in das Forum C++ (auch C++0x und C++11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Bitte komplettes Minimalbeispiel mit kompletter Fehlermeldung. Ich habe mehrere Verdachtsmomente, von denen ich nicht weißt, ob sie wegen der Kürzung für das Forum kommen oder echt sind.

    Falls das das Minimalbeispiel sein soll:
    Da fehlen mindestens schon einmal Includeguards und ein paar Includes.

    Allgemeine Fehler:
    - Das Design mit dem Pointer als Klassenmember ist schlecht und zudem noch falsch umgesetzt.
    - 10^(-6) ist höchstwahrscheinlich nicht, was du denkst, was es ist.



  • Das sieht irgendwie nicht nach C++ aus...

    _Werte_m = new MATRIX2D<double>;
    

    Erstens: Nutze bitte eine Initialisierungsliste.
    Zweitens: Hier ist AFAICS keine dynamische Speicherallozierung nötig.
    Drittens: Die Syntax ist falsch - da muss ein leeres Klammerpaar ( () bzw. {} ) hinter den Typ.

    anwenderklasse(){
    delete ~_Werte_m;
    return;
    } // Ende Dekonstruktor
    

    Es heißt Destruktor; und die Tilde gehört nicht in das delete -Statement sondern vor den Klassennamen. Und es muss auch nicht an das Ende jeder Funktion die nichts zurückgibt ein return -Statement.

    10^(-6)
    

    Das ist - wie SeppJ schon angedeutet hat - nicht 10610^{-6}, sondern 10 XOR -6. Wenn wir mit dem Zweierkomplement rechnen, dann ist das die folgende Rechnung:

    00000000 00000000 00000000 00001010
    ^ 11111111 11111111 11111111 11111010 // -6 = ~(6 - 1)
    = 11111111 11111111 11111111 11110000
    

    Das hat den Wert -16.



  • Eigentlich möchtest Du:

    template <typename T>
    double eigene_interpolation(MATRIX2D<T>& values, const double gesucht, const double kriterium){
    // Quelltext
    }
    

    und

    class anwenderklasse{
    private:
    MATRIX2D<double> Werte;
    // usw.
    public:
    anwenderklasse(){
    
    // Mache damit etwas
    } // Ende Konstruktor
    
    void klassen_funktion(){
    // Quelltext
    double wert = eigene_interpolation(Werte, 3, 1e-6);
    // Quelltext
    }
    
    ~anwenderklasse(){
    } // Ende Destruktor
    };
    


  • Sone schrieb:

    Drittens: Die Syntax ist falsch - da muss ein leeres Klammerpaar ( () bzw. {} ) hinter den Typ.

    Seit wann?


  • Mod

    Thomas_Cpp schrieb:

    Die IDE Eclipse Indigo zeigt jetzt allerdings an:

    Multiple markers at this line
    - Invalid arguments ' Candidates are: double eigene_interpolation(? *, double, double) '

    Und was sagt der Compiler?



  • lole schrieb:

    Sone schrieb:

    Drittens: Die Syntax ist falsch - da muss ein leeres Klammerpaar ( () bzw. {} ) hinter den Typ.

    Seit wann?

    Hui! Zu viel Java des guten 😃



  • Hallo allerseits,

    danke für eure Antworten. Mit

    void klassen_funktion(){
    // Quelltext
    double wert = eigene_interpolation<double>(Werte, 3, 1e-6);
    // Quelltext
    }
    

    ist es komischerweise aus Sicht des Compilers (g++) getan. Die Eclipse IDE meckert immernoch

    Invalid arguments ' Candidates are: double eigene_interpolation(? *, double, double) ' ... line 76 Semantic Error

    Vielleicht ein Bug!

    Mein 10^6 habe ich jetzt auch durch ein pow ersetzt. Ein dummer Fehler von mir. Das kommt, wenn man den halben Tag MATLAB und den anderen Tag C++ benutzt.

    Eine andere jetzt offene Frage:

    C++:
    _Werte_m = new MATRIX2D<double>;

    Erstens: Nutze bitte eine Initialisierungsliste.
    Zweitens: Hier ist AFAICS keine dynamische Speicherallozierung nötig.
    Drittens: Die Syntax ist falsch - da muss ein leeres Klammerpaar ( () bzw. {} ) hinter den Typ.

    Ich löse es momentan immer so, wenn ich eine Klasse mit einem speziellen (also mit Übergabe mehrerer Parameter) Konstruktor habe, und die als private/protected in eine andere Klasse integrieren möchte als pointer und dann new.
    Beim new-Befehl kann ich dann den Konstruktor auswählen.
    Im Destruktor muss ich lediglich darauf achten, dass ich den Speicherplatz wieder freigebe (delete).

    Es hört sich an, als wenn es dabei einen geschickteren Weg gibt.

    cu && Danke 😉

    Thomas


  • Mod

    Thomas_Cpp schrieb:

    Es hört sich an, als wenn es dabei einen geschickteren Weg gibt.

    Ja! Die genannte Initialisierungsliste. Unbedingt benutzen und new und delete vergessen.


Anmelden zum Antworten