große Vektoren überladen



  • Okay, super! ich versuche jetzt mal alles zu ordnen und auch schon zu programmieren. So ganz hatte ich Überladung wohl doch noch nicht verstanden. Ich melde mich nochmal bei, wenn ich einen Schritt weitergekommen bin.
    Vielen, vielen Dank schonmal für eure Hilfe!!



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



  • Na komm, ob nun object.add(other); oder object += other; macht doch keinen so großen Unterschied.

    Nachdem ich mal 9 Monate Java gemacht hatte (länger hab ich Webshops & Co nicht ausgehalten), fehlten mir in C++ zwei Dinge:

    • enum classes. In Java kann man enums mit Objekten haben, die dann z.B. bestimmte getter haben. Das ist sehr sehr praktisch. In C++ müsste man dann x static Objekte einer Klasse anlegen und irgendwie zusehen, dass der Konstruktor nicht öffentlich ist. Sehr unschön.
    • In Java läuft der Constructor erst, wenn das Objekt seinen finalen Typ hat, d.h. ich kann dort auch bereits virtuelle Funktionen aufrufen. In C++ geht das so nicht, weil der Constructor dafür "zu früh" läuft. Vielleicht war das Pattern nicht optimal, im Constructor bereits virtuelle Funktionen aufzurufen, aber das fehlte mir in C++ eine Zeit lang deutlich.
    • generell hatte ich in Java das Gefühl, dass wir ständig hunderte Klassen geschrieben haben, die eigentlich nur irgendwas durchgereicht haben und man beim Debuggen von einer Klasse zur nächsten gekommen ist, ohne dass eigentlich irgendwas passiert wäre.
    • Java kompiliert "etwas" schneller als C++

    Das ist sicher sehr subjektiv und es gibt viel mehr. Aber das sind die Punkte, an die ich mich am meisten erinnere.



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

    Na komm, ob nun object.add(other); oder object += other; macht doch keinen so großen Unterschied.

    Also für mich macht es schon einen Unterschied ob Strings mittels

    str1 == str2
    

    oder

    str1.equals(str2)
    

    verglichen werden. Compiliert nämlich leider beides, nur das erste vergleicht eben nur den Inhalt der Referenzen und nicht der Objekte selbst. Gerade fehlendes operator Overloading lässt mich Java ziemlich hassen (nicht nur das, ist aber auch ein riesen Punkt).

    Werde ja gerade durch die Uni dazu gezwungen mir Java anzueignen. Das ist mit einem Background von knapp 15 Jahren c++ jetzt kein Hexenwerk aber bringt einen auch teilweise echt zum Verzweifeln^^

    Dazu gesellen sich dann noch solche Dinge wie fehlender impliziter copy-support, DTors, const-correctness, generelle value semantics von Objekten, etc.



  • @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