OOP Newbie/ std::string' to `double' in return



  • zuzu schrieb:

    Hallo,

    class Angestellter
    {
    
            
    public:
           // Nebenbei: string nachame gewollt? ist in der definition anders
           Angestellter(string nachame, string vorname, double brutto);
    
    };
    


  • Wenn du dir den Fehler mal genau durchliest, solltest du es verstehen. Wie soll eine Funktion die double zurückgeben soll, eine Variable vom Typ string zurückgeben?

    ...
    private:
            string m_Brutto; //m_Brutto ist vom Typ string
    
    public:
           double ZeigBrutto(); //ZeigBrutto soll double zurückgeben
    ...
    double Angestellter::ZeigBrutto() const //hier kannst du noch const dahinter setzen,
    //da es nur eine return methode ist und nichts verändert wird 
    {
           return m_Brutto; //double als Rückgabe erwartet, aber string gegeben
    }
    ...
    


  • ach wie dumm von mir!

    Danke!

    class Angestellter
    {
    private:
            string m_Nachname;
            string m_Vorname;
            double m_Brutto;
    

    so gehts!

    super vielen dank!



  • habe noch einmal ein paar Fragen zum Programm.

    class Angestellter
    {
    private:
            string m_Nachname;
            string m_Vorname;
            string m_Brutto;
    
    public:
           double ZeigBrutto();
           void SetzeBrutto(double neuBrutto);
           Angestellter(string nachame, string vorname, double brutto);
           ~Angestellter();
    };
    

    könnte mir von euch jemand mal diesen abschnitt ewas erklären was nämlich nicht genau was dort abgeht.

    was mit klar ist, ist, dass eine klasse mit namen angestellter erzeugt wird.

    diese klasse besitzt untr private die attribute: string m_Nachname, string m_Vorname, string m_Brutto. sind atributte immer eigenschaften die die klasse beinhalten soll?

    am wenigsten verstehe ich alles was nter publich steht. dort werden laut meinen buch die methoden erzeugt. diese methoden können in irgend einer form die atributte verändern. naja aber was heißt das genau?
    außerdem verstehe ich nicht warum hinter double ZeigBrutto(); eine klammer steht?
    wie ist das mit void zu verstehen und warum steht hinter void eine klammer mit einen neuen variablen?
    des weiteren, warum wird als nächtes die klasse oder anderes gesagt der konstruktor aufgerufen der noch fast die gleichen variabeln beinhaltet wie unter private?

    ???

    biite hilf mir!



  • Alsooo ...
    Nur die Methoden deiner Klasse, haben Zugriff auf die Attribute deiner Klasse. Man kann von außen nicht draufzugreifen und nicht verändern, da sie "private" sind. Die Methoden werden meistens "public" gemacht, d.h. du kannst von außen eine Methode dieser Klasse aufrufen. Mit

    double ZeigBrutto();
    

    machst du vorerst bekannt, dass diese Klasse eine Methode namens ZeigBrutto mit dem Rückgabetyp "double" besitzt. Warum da jetzt 2 Klammern sind ist ganz klar, deine Methode brauch auch eine Parameterliste. Hättest du z.B. jetzt eine Variable die dieser Methode übergeben werden muss, könnte das ganze auch so aussehen

    double ZeigBrutto(int uebergebene_zahl);
    

    Wenn du sie jetzt deklarierst, musst du sie auch woanders definieren. Deine Methode steht also entweder in der Header-Datei unter der Klasse oder in einer Cpp Datei und sieht so aus

    double Angesteller::ZeigBrutto()
    {
        ...
    }
    

    Hier wird dem Compiler gesagt, dass ZeigBrutto() eine Methode der Klasse "Angesteller" ist mit den zwei "::". Der Konstruktor wird aufgerufen, sobald ein Objekt dieser Klasse erstellt wird.

    Angestellter as;
    

    Wenn du das gemacht hast, wird der Konstruktor aufgerufen, der meistens benutzt wird um einige attribute auf einen bestimmten Wert zu setzen, da du in der Klasse z.B. sowas nicht machen kannst.

    class Klasse
    {
        private:
            int zahl = 50;
            bool boolean = true;
    };
    

    "Angesteller" ist die Klasse und "as" das Objekt, womit gearbeitet wird. Somit kannst du nun z.B. die "ZeigBrutto" Methode aufrufen und das von außen, da sie public ist.

    as.ZeigBrutto();
    

    "void" musst du vor eine Methode oder Funktion schreiben wenn kein Typ zurückgegeben wird, damit ist das "return" gemeint. Du hast sicherlich schonmal am Ende einer Funktion

    return irgendeine_variable;
    

    gesehen. Wenn du eine Zahl vom Typ Integer zurückgeben willst, muss deine Methode oder deine Funktion vom Typ Integer sein und "int" muss vor der Methode oder Funktion stehen. Gibst du aber nichts zurück, machst du das mit "void" klar. Z.B. wenn du aus einer Funktion eine andere aufrufst und die andere Funktion nicht mehr verwendest, sozusagen auf eine andere Funktion springst und somit nichts zurückgeben musst.



  • wow! vielen dank für die schnelle und ausführliche antwort!

    muss aber ganz ehrlich sagem dass ich noch ein paar fragen habe.

    derzeit arbeite ich so, dass ich einfach hinter allen methoden eine () setze.
    was genau ist mit Parameterliste gemeint?

    Außerdem wäre es sehr nett wenn du mir noch einmal innerhlab der klasse den konstruktor genauer erklären könntest also:

    Angestellter(string nachame, string vorname, double brutto)
    ;
    

    des weiteren verstehe ich nicht warum ich einfach ein void setzen muss wenn keine werte übergeben werden sollen. in meinen programm wird doch ein wert übergeben und zwar m_brutto

    void Angestellter::SetzeBrutto(double neuBrutto)
    {
         m_Brutto=neuBrutto*1.1;
    }
    

    sorry, dass ich nerve aber ist wirklich wichtig!



  • es würde mir auch helfen wenn dur mir innerhalb des quellcodes ganz genau beschreiben könntest was dort eigentlich passiert. ich hoffe, dass ist nicht zuviel verlangt 😉



  • Na eben, void heisst indem Sinne soviel wie "nichts". Es wird nichts zurückgegeben und das wird einfach klar gemacht, einfach zur Übersicht und das der Compiler weiss das diese Funktion nichts zurückgeben muss. Wir reden nicht von ÜBERgeben, sondern ZURÜCKgeben. Für das Übergeben sorgt die Parameterliste, also das innerhalb von (...). Die Rückgabe ist das vor dem Funktionsnamen. Das du momentan bei jeder Methode mit () arbeitest, muss nicht weiter schlimm sein. Des öfteren habe ich das auch. Ich mache dir einfach mal ein kleines Beispiel, wie man mit dem Konstruktor arbeiten könnte.

    #include <iostream> //sollteste wissen :P
    
    class Klasse //eine Klasse namens Klasse
    {
        private: //private Attribute
            int zahl; //privates Attribut vom Typ int
            std::string satz; //privates Attribut vom Typ string
        public: //öffentliche Attribute
            Klasse() : zahl(50), satz("Foo Bar!") {} //Konstruktor mit Intialisierungsliste, der die Attribute
                                                     //zahl und satz auf einen bestimmten Wert setzt, wenn ein Objekt der Klasse erstellt wurde
    
            void ausgabe_von_attributen() const //Ausgabemethode der Attribute
            {
                std::cout << zahl << " " << satz;
            }
    };
    
    int main()
    {
        Klasse k; //Objekt wird erstellt und somit der Konstruktor ausgeführt
        k.ausgabe_von_attributen(); // Ausgabemethode wird ausgeführt
    }
    

    So wofür jetzt den Konstruktor benutzen ? Du kannst in einer Klasse keine Variablen definieren, höchstens in einer Methode, aber du kannst die Variablen zahl und satz nicht schon vorher definieren. Dafür nehmen wir also den Konstruktor und setzen diese Attribute auf einen bestimmten Wert.



  • ach du kacke.

    innerhalb dieses quellcodes tauchen viele dinge auf die ich noch nicht hatte. ich will dich nicht von wichtigeren dingen deines lebens abhalten aber besteht eventuell die möglichkeit, dass du mir den ablauf an meinen code erklärst?!



  • zuzu schrieb:

    innerhalb dieses quellcodes tauchen viele dinge auf die ich noch nicht hatte. [...] aber besteht eventuell die möglichkeit, dass du mir den ablauf an meinen code erklärst?!

    Was vestehst du denn konkret nicht? Schau dir vielleicht einmal an, was Klassen sind. Das kann man nämlich nicht in zwei Sätzen erklären...



  • Wie hast du die ganze Zeit gelernt? Weil du solltest dich vielleicht mal mit den Basics der OOP in C++ gründlich befassen. Alles erklären kann man nicht, vieles muss man durch Eigeninitiative erlernen sonst fruchtet das alles gar nicht.



  • #include<iostream>
    #include<string>
    
    using namespace std;
    
    class Angestellter
    {
    private:
            string m_Nachname; //Attribute
            string m_Vorname;
            double m_Brutto;
    
    public:
           double ZeigBrutto(); //gibt den Wert des Attributs m_Brutto zurück
           void SetzeBrutto(double neuBrutto); //setzt einen neuen Wert für Brutto von der main aus
                                               //in diesem Falle z.B. auf 3000
           Angestellter(string nachame, string vorname, double brutto); //Konstruktor der den
                                                                        //Attributen einen Wert zuweist
           ~Angestellter(); //destruktor noch nicht notwendig
    };
    //______________________________________________________________________________________
    double Angestellter::ZeigBrutto() const //diese Methode kann const gesetzt werden, da sie nichts
    {                                       //verändert
           return m_Brutto; //diese Methode ermöglicht einen kleinen Zugriff auf das private Attribut
                            //m_Brutto
                            //die Variable Bruttolohn aus der main() kriegt den Wert von m_Brutto zu-
                            //gewiesen, indem wir Bruttolohn = Angesteller1.ZeigBrutto(); schreiben
                            //und Bruttolohn den zurückgegeben Wert von ZeigBrutto() bekommt
                            //der im erste Fall 2000 entspricht und beim 2. aufrufen 3000
    }
    
    void Angestellter::SetzeBrutto(double neuBrutto)
    {
         m_Brutto=neuBrutto; //m_Brutto wird auf 3000 gesetzt
    }
    
    Angestellter::Angestellter(string nachname, string vorname, double brutto)
    {
        //dem Konstruktor werden 3 Werte übergeben : Meier, Franz, 2000
        m_Nachname = nachname; //m_Nachname = Meier
        m_Vorname = vorname; //m_Vorname = Franz
        m_Brutto = brutto; //m_Brutto = 2000
    }
    //man könnte diesen Konstruktor auch folgt schreiben bzw. sollte man
    /*
    Angesteller::Angesteller(string nachname, string vorname, double brutto) :
    m_Nachname(nachname), m_Vorname(vorname), m_Brutto(brutto) {}
    */
    
    Angestellter::~Angestellter() 
    {
        //destruktor ist nicht nötig, da nicht mit dem Heap gearbeitet wurde
        //Heap = Speicher, für den man selbst sorgen muss und aufräumen muss
    }
    //_______________________________________________________________________________________
    
    int main()
    {
       double Bruttolohn; //Variable in der der Bruttolohn gespeichert wird, von einem Objekt der Klasse
                          //Angesteller
                          //diese Variable kriegt ihren Wert durch die Methode ZeigBrutto() die 
                          //einen Wert zurückliefert, nämich das Attribut m_Brutto
       Angestellter Angestellter1("Meier", "Franz", 2000.0); //ein Objekt von Angesteller wird erstellt
                                                             //dem Konstruktor werden Werte übergeben
                                                             //m_Nachmame wird auf Meier gesetzt
                                                             //m_Vorname wird auf Franz gesetzt
                                                             //m_Brutto auf 2000
       Bruttolohn = Angestellter1.ZeigBrutto(); //Bruttolohn bekommt den Wert der gerade auf 2000 
                                                //gesetzt wurde Bruttolohn = m_Brutto
       cout << "Bruttolohn:" << Bruttolohn <<endl;
       Angestellter1.SetzeBrutto(3000.0); // m_Brutto wird auf 3000 gesetzt
       Bruttolohn = Angestellter1.ZeigBrutto(); //Bruttolohn = m_Brutto (3000)
       cout << "Bruttolohn:" << Bruttolohn <<endl;
       system ("PAUSE"); //ich würde hier raten <conio.h> zu inkludieren und getch() zu benutzen
       return 0;
    }
    

    Wenn du jetzt immer noch nichts verstanden hast, würde ich dir raten dir alles nochmal genau aus deinem Buch durchzulesen.



  • wow vielen dank für die antwort!!!

    wirklich sehr gut und ausfürhlich erklärt.

    trotzdem eine frage. ich habe gelernt, dass man nur mit den methoden, die in der klasse unter public zu finden sind auf die attribute bzw. membervariablen zugreifen kann.

    wenn wir jetzt aber mit folgenden code:

    Angestellter::Angestellter(string nachname, string vorname, double brutto)
    {
        //dem Konstruktor werden 3 Werte übergeben : Meier, Franz, 2000
        m_Nachname = nachname; //m_Nachname = Meier
        m_Vorname = vorname; //m_Vorname = Franz
        m_Brutto = brutto; //m_Brutto = 2000
    }
    

    auf die attritbute zugreifen mache ich dies nicht über eine methode sondern über den konstruktor. wie ist das zu verstehen?
    mir ist schon klar, dass der nachename, vorname und das brutto gehalt innerhalb der main funktion an den konstruktür übergeben werden (ich meine den konstruktor der innerhalb der Methodendefinition steht) bzw. man sagt dort, dass der nachname gleich den wert haben soll wie m_nachname. aber wo ist bitteschon die mehthode innerhalb der klassendeklaration genauer gesagt unter public die sagt, dass nachname=m_nachnemane ist?

    weil ganz genau genommen existiert dort keine methode sondern "nur" ein
    konstruktor. und zwar dieser hier:

    Angestellter(string nachname, string vorname, double brutto);
    

    ich bin aber der meinung, dass die übergabe der werte auch über eine methode laufen muss oder wie kann es sein, dass plötzlich die attribute durch den konstruktor verändert werden können?

    danke!



  • Ein Konstruktor IST eine Methode. Es ist einfach eine Methode die ausgeführt wird, selbst wenn man es nicht will, wenn man ein Objekt der Klasse erstellt.



  • mittlerweile habe ich hoffentlich alles verstanden aber mich würde mal interessieren wo genau in meinen prog instanzen sind?

    außerdem wäre es toll folgende bezeichnungen zu wissen:

    hier ist einmal der konstruktor zu sehen der sich innerhalb der klasse im bereich publich befindet:

    Angestellter(string nachname, string vorname, double brutto); 
    
    ~Angestellter();// Desktruktor
    

    aber wie bezeichnet man folgenden ausdruck der sich bereits in der methodendefinition befindet:

    Angestellter::Angestellter(string nachname, string vorname, double brutto)
    {
                                      m_Nachname = nachname;
                                      m_Vorname = vorname;
                                      m_Brutto = brutto;
    }
    

    ist dies auch eon konstruktor??!???

    und dann wäre es toll zu wissen welche konstruktor ausgeführt wird bzw aufgerufen wird wenn ein objekt der klasse angestellter erstellt wird. denn anscheinend taucht der konstruktor ja zweimal auf.

    jetzt gibt es bestimmt ärger 🙄



  • Ärger gibts nicht wirklich
    ja, das ist auch ein Konstruktor

    welcher aufgerufen wird, ist, wie man das Objekt seiner Klasse erstellt:

    class Test
    {
    Test();         // Standardkonstruktor (parameterloser Konstruktor)
    Test(int zahl); // auch ein Konstruktor
    ~Test();        // Destruktor
    }
    

    wenn ich jetzt ein Objekt der Klasse Test erstelle, dann wird hier:

    Test myObject;
    

    der erste Konstruktor aufgerufen, weil ich beim Erstellen des Objekts keinen Parameter mit übergeben habe

    wenn ich jetzt aber sowas mache:

    Test myObject(10);
    

    dann wird da der zweite Konstruktor aufgerufen, weil ich einen Parameter übergeben, der ein int (eine Zahl) ist und dadurch eben zum zweiten Konstruktor meiner Klasse passt

    das würde aber zu nem Fehler führen:

    Test myObject("hallo");
    

    weil ich keinen Konstruktor habe, der einen string entgegennimmt

    das ist natürlich auch falsch:

    Test myObject(10, 10);
    

    weil es keinen Konstruktor mit 2 Parameter gibt

    eine Instanz deiner Klasse in deinem Programm ist hier:

    Angestellter Angestellter1("Meier", "Franz", 2000.0);
    

    da erstellst du ein Objekt (eine Instanz wenn man so will) von deiner Klasse

    ich hoffe, man konnte verstehen, was ich hier will 🙂



  • Nein der Konstruktor existiert nicht 2 Mal. Innerhalb deiner Klasse deklariest du nur die Attribute und deine Methoden. Erst untendrunter definierst du sie. In deiner Klasse schreibst du was dein Konstruktor für Parameter entgegen nimmt, dann unten drunter schreibst du was dein Konstruktor macht.
    Deine Klasse könnte auch so aussehen.

    #include <iostream>
    
    class Angesteller
    {
        private:
            std::string m_Nachname;
            std::string m_Vorname;
            double m_Brutto;
        public:
            Angesteller(std::string nachname, std::string vorname, double brutto) :
            m_Nachname(nachname), m_Vorname(vorname), m_Brutto(brutto) {}
            double Zeigbrutto() const
            {
                return m_Brutto;
            }
            void SetzeBrutto(double neu_brutto)
            {
                m_Brutto = neu_brutto;
            }
            ...
    };
    
    int main()
    {
        ...
    }
    

    Und wie du siehst sind ist die Funktionalität der Methoden schon IN der Klasse geschrieben und nicht außerhalb mit

    double Angesteller::ZeigBrutto() 
    { 
        ... 
    }
    


  • Nein der Konstruktor existiert nicht 2 Mal. Innerhalb deiner Klasse deklariest du nur die Attribute und deine Methoden. Erst untendrunter definierst du sie. In deiner Klasse schreibst du was dein Konstruktor für Parameter entgegen nimmt, dann unten drunter schreibst du was dein Konstruktor macht.
    Deine Klasse könnte auch so aussehen.

    #include <iostream>
    
    class Angesteller
    {
        private:
            std::string m_Nachname;
            std::string m_Vorname;
            double m_Brutto;
        public:
            Angesteller(std::string nachname, std::string vorname, double brutto) :
            m_Nachname(nachname), m_Vorname(vorname), m_Brutto(brutto) {}
            double Zeigbrutto() const
            {
                return m_Brutto;
            }
            void SetzeBrutto(double neu_brutto)
            {
                m_Brutto = neu_brutto;
            }
            ...
    };
    
    int main()
    {
        ...
    }
    

    Und wie du siehst sind ist die Funktionalität der Methoden schon IN der Klasse geschrieben und nicht außerhalb mit

    double Angesteller::ZeigBrutto() 
    { 
        ... 
    }
    


  • okay jau so stelle ich mir das auch vor!!!

    aber warum existiert denn bitte die möglichkeit beides extra aufzuteilen. damit meine ich warum wird in einen basic buch die klasse extra geschrieben und die methodendefinition.

    hat das ein vorteil? naja auch nicht so wichtig 😉
    _______________________________________________________________________________

    meine fragen hören einfach nicht auf. ich möchte alles ganz genau wissen deswegen frage ich so oft nach.

    in meine buch steht unter anderem auch, dass nur die methoden in public die attribute verändern dürfen bzw. durch die methoden hat man zugriff auf die atribute!

    wenn ich jetzt aber mal weiter spinne weißt mein programm im folgenden abschnitt
    den attributen werte zu. das dürfe ja eigentlich nicht funktieren weil dies ja nur über die methoden geht und die methoden stehen im public bereich.

    Angestellter::Angestellter(string nachname, string vorname, double brutto)
    {
           m_Nachname = nachname;
           m_Vorname = vorname;
           m_Brutto = brutto;
    }
    

    wenn wir jetzt aber neu definieren und behaupten alles sind methoden, wie wir dies ja bereits bei den konstruktoren gemacht haben würde es ja passen. 😃

    aber mein buch sagt mir nur die methoden in public können die attribute verändern.

    nächste frage was heißt verändern? lesezugriff oder voll\schreibzugriff??

    danke



  • hab enoch einmal eine theorie die ich von dir bestätigt haben möchte 😉

    wenn folgendes in der main aufgerufen wird

    nachname = Angestellter1.ZeigName();
    

    passiert aus meiner sicht folgendes:
    1. das porgramm springt in die klasse und zwar in den bereich public.
    dort findet das porgramm dann die entsprechende methode.
    (anscheinend werden aber keine werte übergeben wie es beim konstruktor
    ist,oder?)

    public:
           string ZeigName();
    

    2. das programm springt in die methodendefinnition und findet dort
    selbstverständlich die passende "methode oder das gegenstück"
    (oder wie man das nennen möchte). dort ist hinterlegt das
    m_Nachname ausgegeben werden soll und das die variabel den wert string hat.
    (schon komisch da der variablen typ ja bereits in der klasse unter public
    festgelegt wurde ,oder?)

    string Angestellter::ZeigName()
    {
           return m_Nachname;
    }
    

    3. das programm springt wieder in die klasse und zwar in den bereich private und
    holt sich de entprechenden wert.

    class Angestellter // Name der Klasse
    {
    private:
            string m_Nachname; // Attribute der Klasse Angestellter
    

    simmt das so???? und wird beim zweiten schritt wirklich nichts übergeben? es steht ja auch nicht in den klammern?!


Anmelden zum Antworten