Wie definiert man einen valarray<double> als Member einer Klasse?



  • Versuche dies:

    public:
    Particle() : position(3) {};
    

    als Construktorzeile.

    Allerdings wird (zumindest bei meinem VS 7.1) die Arraywerte nicht mit 0 initalisiert.
    Aber valarray - Kontruktor ist ja überladen, so dass man auch den Init-Wert eingeben kann als ersten Parameter.

    Warum er das nicht macht, kann ich nicht genau sagen.
    In meiner Doku steht, die Werte würden mit ihrem Standardkonstruktor initialisiert. Und der heißt bei double wohl nicht nullsetzen sondern undefinierter Anfangswert.



  • Ich würde hier eher auf valarray verzichten und die Multiplikation selber implementieren. valarray hat hier IMO keine Vorteile.



  • SeppSchrot schrieb:

    Versuche dies:

    public:
    Particle() : position(3) {};
    

    als Construktorzeile.

    funktioniert leider nicht. Fehler beim Compilieren:
    "invalid conversion from `int' to ` std::valarray<double>*' "

    Es muss doch möglich sein einen valarray als Membervariable einer Klasse zu haben. Dasselbe Problem tritt auch auf, wenn ich anstelle von valarray die
    bekanntere STL Klasse vector verwende.

    MaSTaH schrieb:

    Ich würde hier eher auf valarray verzichten und die Multiplikation selber implementieren. valarray hat hier IMO keine Vorteile.

    ja aber ich möchte doch nicht etwas neu schreiben, was es schon gibt. Abgesehen davon werde ich dann sowieso blitz++ verwenden (objektorientiertes numerisches C++ Paket), weil ich noch einige andere Funktionen brauche. Dort exisitiert aber das genau gleiche Problem, wie bei vector oder valarray aus der STL. Sprich, wenn ich weiss, wie ich einen STL vector oder valarray als Membervariable in eine Klasse aufnehme, dann weiss ich auch wie das in blitz++ geht. Das sollte doch eigentlich ganz einfach sein, oder ?

    Momentan bin ich auch mit meinem Latein am Ende...

    Peter.



  • hast du jetzt wirklich valarray<double> position; stehen? oder valarray<double>* position; ?



  • ??????? schrieb:

    hast du jetzt wirklich valarray<double> position; stehen? oder valarray<double>* position; ?

    Ja du hast Recht - mein Fehler. ich hatte noch valarray<double>* stehen.

    habe jetzt folgendes probiert:

    class Particle { 
    private: 
    valarray<double> position; 
    public: 
    Particle() : position(3) {};
    
    const valarray<double>& getPosition() const { 
    return position; 
    } 
    
    } ;
    

    Und jetzt scheint es zu funktionieren! Erstmals vielen Dank an SeppSchrott und ?????.
    Kann ich denn den Konstruktor auch so schreiben?:

    Particle() {/*code   */ }
    

    also ohne diesen Doppelpunkt . Denn hab ich bis jetzt noch nie verwendet.
    und verstehe deshalb auch nicht ganz die Semantik.

    PS: Die getter Methode ist doch korrekt oder?



  • Kann ich denn den Konstruktor auch so schreiben?:

    Wenn die valarray einen Default-Konstruktor hat ja.

    Das nennt sich Initialisierungsliste. Dannach kannst du googlen. Ruft einfach den valarray Konstruktor mit 3 auf.



  • :::::::: schrieb:

    Kann ich denn den Konstruktor auch so schreiben?:

    Wenn die valarray einen Default-Konstruktor hat ja.

    Das nennt sich Initialisierungsliste. Dannach kannst du googlen. Ruft einfach den valarray Konstruktor mit 3 auf.

    Es geht auch so:

    class Particle { 
    private: 
    valarray<double> position; 
    public: 
    Particle() {position.resize(3); }
    //~Particle() {delete position;} 
    
    const valarray<double>& getPosition() const { 
    return position; 
    } 
    
    } ;
    

    Denke, so ist es wohl am besten. Nochmals danke an SeppSchrott und ::::: und ????? 😉

    Falls euch noch was dazu einfällt, zögert nicht.

    All the best, Peter.



  • Denke, so ist es wohl am besten.

    Wenn du meinst 😉 Find ich nicht :p



  • :::::: schrieb:

    Denke, so ist es wohl am besten.

    Wenn du meinst 😉 Find ich nicht :p

    Warum denn ?



  • Weil ein valarray mit nur 3 Feldern doof ist 😉



  • SeppSchrot schrieb:

    Weil ein valarray mit nur 3 Feldern doof ist 😉

    Genau, das ist verschwendung. Das ist dazu gedacht _viele_ Argumente Bearbeiten zu können. Ich würds mit tupeln versuchen.


Anmelden zum Antworten