Get und Set Methoden



  • Hallo zusammen,

    ich bin gerade dabei zu verstehen wie und wo ich die set und get Methoden verwende.
    Was mir irgendwie schwer fällt.

    Poste hier mal meinen Code :

    Header.h

    #include<iostream>
    #include<string>
    #include<iomanip>
    using namespace std;
    
    class Auto
    {
    	private:
    		string farbe;
    		string name;
    		string kfztyp;
    		string motortyp;
    		float preis;
    		int leistung; 
    	public:
    		Auto();
    		Auto(string Afarbe,string Aname, string Akfztyp, string Amotortyp, float Apreis, int Aleistung );
    		~Auto();
    		void print();
    
    		void   set_f(string farbe){this->farbe=farbe;}
    		void   set_n(string name){this->name=name;}
    		void   set_k(string kfztyp){this->kfztyp=kfztyp;}
    		void   set_m(string motortyp){this->motortyp=motortyp;}
    		void   set_p(float preis){this->preis=preis;}
    		void   set_l(int leistung){this->leistung=leistung;}
    
    		string get_f() { return farbe;}
    		string get_n() { return name;}
    		string get_k() { return kfztyp;}
    		string get_m() { return motortyp;}
    		float  get_p() { return preis;}
    		int	   get_l() { return leistung;}
    
    };
    

    Auto1_UP.cpp :

    #include"Header.h"
    Auto::Auto()
    {
    	cout<<"Auto erstellt";
    
    }
    inline Auto::Auto(string Afarbe,string Aname, string Akfztyp, string Amotortyp, float Apreis, int Aleistung )
    {
    	farbe = Afarbe;
    	name = Aname;
    	kfztyp = Akfztyp;
    	motortyp = Amotortyp;
    	preis = Apreis;
    	leistung = Aleistung;
    }
    inline Auto::~Auto()
    {
    	cout<<"Auto geloescht"<<endl;
    }
    inline void Auto::print()
    {
    	cout<<endl<<fixed<<right<<setprecision(2);
    	cout<<setw(12)<<"Bezeichnung";
    	cout<<setw(12)<<"KFZ Typ";
    	cout<<setw(12)<<"Motortyp";
    	cout<<setw(12)<<"Leistung";
    	cout<<setw(12)<<"Farbe";
    	cout<<setw(12)<<"Preis";
    	cout<<endl;
    	cout<<setw(12)<<this->name;
    	cout<<setw(12)<<this->kfztyp;
    	cout<<setw(12)<<this->motortyp;
    	cout<<setw(12)<<this->leistung;
    	cout<<setw(12)<<this->farbe;
    	cout<<setw(12)<<this->preis;cout<<endl<<endl;
    }
    

    Auto1_Main.cpp :

    #include<iostream>
    #include"Header.h"
    
    using namespace std;
    
    int main ()
    {
    
    	Auto A("Blau","z3","Cabrio","Diesel",111.11,100);
    	Auto B("Gelb","z5","Offroad","Benzin",222.22,75);
    
    	A.print();
    	B.print();
    
    	A.~Auto();
    	B.~Auto();
    
    	cin.get();
    	cin.get();
    	return 0;
    }
    

    Mir stellt sich immer die Frage wie der Syntax vom GET ausschaut wenn ich ihn ausgeben will.
    Z.B in meinem UP wollte ich es mit dem GET machen habs aber nicht hinbekommen.

    Bedanke mich schonmal für Antworten

    Moritz



  • Hallo

    void Auto::print()
    {
      cout << get_f();
    }
    

    Oder was wolltest du wissen!?
    Ansonsten enthält dein Code viel Müll.
    In Stichworten was so als erstes auffällt:
    - warum alles inline
    - Initialisierungslisten
    - nichts sagende Methoden (get_f() !?)
    - direkter Destruktoraufruf
    - float und 'Geld' ist idR Mist
    - const-correctness



  • Hallo Moritz,

    dein Code ist für mich ein Beispiel aus der Kategorie "unnötig kompliziert". Wenn Du eh für jedes Datenelement einen getter und einen setter anbieten willst und gar keine anderen Invarianten hast, die immer gelten müssen, dann sehe ich den Nutzen nicht darin, die Datenelemente privat zu machen und trotzdem getter/setter anzubieten. Es handelt sich hier doch nur um einen Daten-Haltungs-Typ, nichts intelligentes.

    Warum nicht einfach so?

    struct Auto
    {
        string farbe;
        string name;
        string kfztyp;
        string motortyp;
        float preis;
        int leistung;
    };
    
    void foo()
    {
        Auto x = { "gruen", "Otto", "PKW", "Diesel", "123.45", 42 };
    }
    

    ?

    Übrigens: "using namespace std;" hat in einem Header nichts zu suchen. Ob man so eine using-Direktive haben will oder nicht, sollte jede cpp-Datei alleine für sich entscheiden. So zwingst Du diese Direktive jedem auf, der deinen Header inkludiert. Das "verschmutzt" aber den globalen Namensraum.

    Du solltest auch entweder einen herkömmlichen Include-Guard in den Headern verwenden oder "pragma once", damit so ein Header nicht versehentlich 2mal inkludiert wird.

    Moritz Vogt schrieb:

    Auto1_Main.cpp :

    #include<iostream>
    #include"Header.h"
    
    using namespace std;
    
    int main ()
    {
    
    	Auto A("Blau","z3","Cabrio","Diesel",111.11,100);
    	Auto B("Gelb","z5","Offroad","Benzin",222.22,75);
    
    	A.print();
    	B.print();
    
    	A.~Auto();
    	B.~Auto();
    	
    	cin.get();
    	cin.get();
    	return 0;
    }
    

    Du darfst hier den Destruktor gar nicht selbst aufrufen! Das macht der Compiler schon alleine für Dich, wenn die Ausführung diesen Gültigkeitsbereich verlässt. Das ist ja das coole an den Destruktoren in C++.



  • Ich würde es ja auch anders programmieren, gehe aber nur einer Aufgabenstellung nach. Fut Get und Set 😃

    Schriebe sie mal auf :

    Schreiben sie Methoden (get,set) für alle Datenelemente der Klasse Auto

    Schreiben sie einen Defaul-Konstruktor und einen Konstruktor, dieser soll für jedes Datenelemnt einen Parameter haben

    Definieren sie einen Destruktor, der augibt, dass ein Objekt zerstört wird !

    Die Definition der Konstruktoren / Destruktoren soll "explitit inline " sien !
    Die Definition der Methoden soll "implizit inline " sien !

    Schreiben sie eine Methode für die Klasse Auto mit dem Namen "print", die Definition soll in der Datei "Auto.cpp " vorgenommen werden "

    Diese soll folgende Ausgabe erzeugen :
    - Die einzelnne Elemente werden in Feldnern mit je 12 Zeichen ausgegeben und sind rechtsbündig ausgerichtet

    Testen Sie ihr Programm indem sie , im Hauptprogramm zwei Autos erzeugen und rufen sie nacheinandern (achten sie auf einen logischen sinnvollen Ablauf ihres programms) alle methoden , Konstruktoren und Destruktoren auf !

    Danke für die Kritik 😃



  • Hat sich denn deine Frage geklärt?

    Moritz Vogt schrieb:

    Schreiben sie Methoden (get,set) für alle Datenelemente der Klasse Auto

    Wo steht, dass diese getter/setter einen dämlichen Namen kriegen müssen?

    Moritz Vogt schrieb:

    Schreiben sie einen Defaul-Konstruktor und einen Konstruktor, dieser soll für jedes Datenelemnt einen Parameter haben

    Wo steht, dass du keine Initialisierungsliste nehmen sollst?

    Moritz Vogt schrieb:

    Die Definition der Konstruktoren / Destruktoren soll "explitit inline " sien !
    Die Definition der Methoden soll "implizit inline " sien !

    ~~
    Machst du zwar nicht, aber immerhin erklärt es, warum überhaupt inline.~~
    Ok, das bezieht sich wohl auf die getter/setter.

    Moritz Vogt schrieb:

    Schreiben sie eine Methode für die Klasse Auto mit dem Namen "print", die Definition soll in der Datei "Auto.cpp " vorgenommen werden "

    Wo steht, dass diese nicht const sein darf?

    Moritz Vogt schrieb:

    Destruktoren auf !

    Damit ist ganz sicher kein expliziter Aufruf gemeint. Schlimmstenfalls ein new/delete.

    Moritz Vogt schrieb:

    Danke für die Kritik 😃

    Gerne 🙂



  • hier mal meine 2 cents

    Konstruktoren inline zu definieren, habe ich noch nie gesehen. Ich würde hiuer die C++11 Initialisierungsliste verwenden.

    Dein expliziter destruktoraufruf ist unnötig und meiner Meinung nach unzulässig. Zum debuggen kannst du natürlich ausgaben in deine Konstruktoren/Destruktoren packen, da du aber als Class member ausschließlich Objekte vom built-in typ hast und die String Objekte, sich um ihre eigene Dynamic Memory Allocation kümmern, brauchst du hier gar keinen Destruktor zu definieren.

    Bei deinen cin.get() Aufrufen hast du da glaube ich was verwechselt.

    Das sind methodenaufrufe der istream objekte und haben erstmal nichts mit deinen getter Methoden aus deiner Klassendefinition zu tun.

    mit cin.get() liest du input ein, zB vom Keyboard oder aus ner Datei. Ist das das was du hier vorhast?s


Anmelden zum Antworten