große Vektoren überladen



  • @hustbaer sagte in große Vektoren überladen:

    @Calumeth sagte in große Vektoren überladen:

    Wie bei Java damals. Ich instanziiere also von außerhalb ein Objekt meiner Signalklasse, und soll dann mit den Rechenoperatoren +,-,* damit rechnen können.

    Also wenn Java Operator Overloading unterstützt, dann hab ich da gewaltig 'was verpasst.
    (Nicht dass ich Java verwenden würde, aber so gundlegende Dinge interessieren mich dann schon, auch bei Sprachen die ich verabscheue.)

    Das war aufs instanziieren bezogen. Unglücklich ausgedrückt.



  • Ich habs jetzt hinbekommen, und wollte eben meine Lösung kundtun. Vielleicht steht ja irgendwann jemand vor einem ähnlichen Rätsel.

    Main:

    #include <iostream>
    #include "signal.cpp"
    
    Signal sig;
    
    int main()
    {
    	sig = Signal();     //erstellt ein Objekt der Klasse Signal
    	sig.file_read();    //liest die Signalwerte ein
    	sig + 5;            //addiert jedem Wert im Vektor +5 dazu 
    }
    

    Signalklasse:

    #include <iostream>
    #include <fstream> 
    #include <vector>
    
    class Signal
    {
    public:
        Signal();
        std::vector<std::string> herzfrequenzen; //hier werden String eingelesen
        std::vector<double> herzfrequenzen_int; //hier werden Strings umgewandelt in doubles gespeichert
        inline int file_read(); //Methode zum einlesen einer Datei
        inline void operator+(int addition); //Methode zum Überladen des "+"Operanden
    };
    
    inline Signal::Signal() {}
    
    void Signal::operator+(int addition)
    {
        for (int i = 0; i < herzfrequenzen_int.size(); i++)
        {
            herzfrequenzen_int.at(i) = herzfrequenzen_int.at(i) + addition;
        }
    }
    

    Ich habe mein Problem jetzt mit einer einfachen for-Schleife gelöst, die jeden Wert des Vektors mit dem gewünschten addiert.

    Beste Grüße und vielen Dank an alle!


  • Mod

    @Calumeth sagte in große Vektoren überladen:

    Signal sig;
    
    int main()
    {
    	sig = Signal();     //erstellt ein Objekt der Klasse Signal
    

    Du hast zu viel Java gemacht. Würdest du auch folgendes schreiben?

    int i;
    
    int main()
    {
    	i = int();     //erstellt ein Objekt der Klasse int
    

    Funktioniert zwar, aber ziemlich dämlich, oder? Das ist nicht anders, egal ob die Klasse int oder Signal ist.


    Weiter:

        std::vector<std::string> herzfrequenzen; //hier werden String eingelesen
    

    Nein, da werden keine Strings gelesen. Schreib keinen Quatsch in Kommentaren. Oder wenn du denkst, der Kommentar wäre richtig: Er ist Quatsch.

    Die Strings gehören gar nicht als Member in die Klasse, weil es ja nur eine einzige Methode geben sollte, die sie nutzt. Und in dieser Methode brauchst du auch keinen Vector an Strings, denn du kannst ja gleich deine Werte einlesen.


        std::vector<double> herzfrequenzen_int; //hier werden Strings umgewandelt in doubles gespeichert
    

    Siehe oben zum Kommentar.


        inline int file_read(); //Methode zum einlesen einer Datei
    

    Inline? Int? Was geht hier vor? Und woher wird gelesen?
    Außerdem: Wenn es doch bloß eine Methode gäbe, wie man universell aus jeder beliebigen streamartigen Quelle lesen (und schreiben) könnte. Dann wären alle Probleme automatisch erledigt. Könnte man vielleicht im Kapitel über Operatorüberladung unterbringen so eine Methode, weil das gewiss sehr schön ginge damit…


        inline void operator+(int addition); //Methode zum Überladen des "+"Operanden
    

    Inline? Ok, macht vielleicht schon eher Sinn hier. void? Das Ergebnis einer Addition ist ein void? Und was ist das für eine Parametername? Weiß ja jeder aus der Mathematik, wenn man 5 + 6 schreibt, dann nennt man die 5 und die 6 die "Additionen" 🙄


    inline Signal::Signal() {}
    

    Wozu ist das da?


    void Signal::operator+(int addition)
    {
        for (int i = 0; i < herzfrequenzen_int.size(); i++)
        {
            herzfrequenzen_int.at(i) = herzfrequenzen_int.at(i) + addition;
        }
    }
    

    Super. Weiß ja jedes Kind, wenn man 5+6 schreibt, dann ist das Ergebnis void, aber die 5 ist hinterher 'ne 11.



  • @SeppJ sagte in große Vektoren überladen:

    Weiß ja jeder aus der Mathematik, wenn man 5 + 6 schreibt, dann nennt man die 5 und die 6 die "Additionen" 🙄

    @Calumeth Lass' Dich nicht von SeppJ veräppeln, sie heißen natürlich Additoren!



  • @Calumeth Die Dinger heißen natürlich Summand. Allerdings sind gerade bei Operatoren zum Beispiel auch Namen wie "lhs" und "rhs" für "left/right hand side", also das Ding links und rechts vom Operator, üblich. Bei einem einfachen Wert für eine Summe könnte man das auch value nennen. Nur ist "Addition" ein Nomen, das nicht zu einem Wert passt. (allerdings sind alle anderen Kommentare von @SeppJ viel wichtiger, versuche die zu verstehen!)

    Du solltest noch einmal überlegen, ob du auch 5 + sig statt nur sig + 5 rechnen können willst. Du hast hier nicht +, sondern eine Art von += implementiert, die du aber + genannt hast. Schau dir auch an, was die üblichen Rückgabetypen sind. Den Operator + kannst du mithilfe von += und dem Copy-Constructor erzeugen.



  • Dieser Beitrag wurde gelöscht!

Anmelden zum Antworten