Frage: Klasse - Variablen in Get-Methoden ohne Set-Methoden



  • Hallo,

    Ich habe eine Klasse mit vorgegebener h.Datei und cpp.Datei und muss dazu den Code in der Main-Datei schreiben und habe als Anhaltspunkt noch zusätzlich wie die Ausgabe dann aussehen soll.

    Klassen h.Datei:

    class Vortrag
    {
    
    
    private:
    	string m_Bezeichnung;
    	string m_Ort;
    	string m_Redner;
    	string m_Thema;
    	
    
    public:
    	Vortrag();
    	Vortrag(string Redner, string Bezeichnung, string Thema);
    	~Vortrag();
    
    	bool setOrt(string Ort);
    	string getBezeichnung();
    	string getRedner();
    	string getThema();
    	string getOrt();
    
    };
    
    

    Klassen cpp.Datei:

    Vortrag::Vortrag()
    	:m_Bezeichnung(""), m_Redner(""), m_Thema(""), m_Ort("N 4.10")
    {}
    
    
    Vortrag::Vortrag(string Redner, string Bezeichnung, string Thema)
    	:m_Redner(Redner),m_Bezeichnung(Bezeichnung), m_Thema(Thema), m_Ort("N 4.10") 
    {}
    
    Vortrag::~Vortrag(){}
    
    bool Vortrag::setOrt(string Ort)
    {
    	if (Ort != "N 4.10")
    	{	 m_Ort = Ort ;
    		return true;
    	} return false;
    }
    
    
    
    string Vortrag::getBezeichnung() { return m_Bezeichnung; }
    string Vortrag::getRedner() { return m_Redner; }
    string Vortrag::getOrt() { return m_Ort; }
    string Vortrag::getThema() { return m_Thema; }
    

    Und hier nun mein Versuch bisher für die Main-Datei:

    int main()
    {
    
    	string Ort = "HS 0.43";
    	string Redner = "Bjarne Stroustrup";
    	string Bezeichnung = "Motivationsvortrag";
    	string Thema = "C++";
    
    	Vortrag Vortrag1;
    
    	
    	Vortrag1.setOrt(Ort);
    	cout << endl
    		 << "Bezeichnung:\t\t" << Vortrag1.getBezeichnung() << endl
    		 << "Ort:\t\t" << Vortrag1.getOrt() << endl
    		 << "Redner:\t\t" << Vortrag1.getRedner() << endl
    		 << "Thema:\t\t" << Vortrag1.getThema() << endl;
    		
    
    	system ("pause");
        return 0;
    }
    

    Meine Frage:
    Das mit dem Ort für die Ausgabe und der Set- / Get-Methode für den Ort klappt problemlos. Für die Bezeichnung, das Thema und den Redner habe ich allerdings keine Set-Methode und muss auf einem anderen Weg die Variablen für Redner, Thema, Bezeichung in die Get-Methoden übertragen und ich habe keine Ahnung wie dies ohne Set-Methode funktioniert.

    Die Ausgabe sieht wie folgt aus:

    Bezeichnung: Motivationstraining
    Ort: HS 0.43
    Redner: Bjarne Stroustrup
    Thema: C++
    

    Über einen Tipp wäre ich sehr Dankbar!



  • Schreibe bitte in eine Zeile vor Deinem Code jeweils ``` und in eine Zeile nach Deinem Code ```. Alternativ markiere Deinen Code und klicke auf das </> in der Symbolleiste über dem Eingabefenster.

    Du kannst Deinen Beitrag auch im Nachhinein bearbeiten. Den Menüpunkt "Bearbeiten" findest Du in dem Drei-Punkte-Menü rechts unter Deinem Beitrag.

    @Dude sagte in Frage: Klasse - Variablen in Get-Methoden ohne Set-Methoden:

    als Anhaltspunkt noch zusätzlich wie die Ausgabe dann aussehen soll.

    Das fehlt glaube ich in Deinem Beitrag.



  • @Swordfish Danke, habe ich gemacht!



  • @Dude sagte in Frage: Klasse - Variablen in Get-Methoden ohne Set-Methoden:

    Über einen Tipp wäre ich sehr Dankbar!

    Benutze den Konstruktor von Vortrag der Redner, Bezeichnung und Thema nimmt und für den Ort Vortrag::setOrt() wie Du es bereits tust. Du musst die Werte nicht vorher unbedingt in Extravariablen ablegen:

    #include <iostream>
    #include "vortrag.h"
    
    int main()
    {
    	Vortrag Vortrag1{ "Bjarne Stroustrup", "Motivationsvortrag", "C++" };
    	Vortrag1.setOrt("HS 0.43");
    
    	std::cout <<   "Bezeichnung:  " << Vortrag1.getBezeichnung()
    	          << "\nOrt:          " << Vortrag1.getOrt()
    	          << "\nRedner:       " << Vortrag1.getRedner()
    	          << "\nThema:        " << Vortrag1.getThema() << '\n';
    }
    

    • Wenn in der Headerdatei ein using namespace std; steht (wovon bei dem gezeigten Code auszugehen ist) und euer lehrender nichts dazu gesagt hat, bitte den lehrenden entsorgen. Header files: Avoid C++ 'using' directives.
    • Den Destruktor bei dieser Klasse hinzuschreiben ist auch sinnfrei.
    • Die Getter solten const-qualified sein.
    • return 0; in main() ist nicht nötig. main() gibt auch 0 zurück wenn das return-Statement fehlt.
    • system("pause"); - Why is it wrong?


  • @Swordfish Danke! Super logisch. 😒

    Das war eine Klausuraufgabe... so ist das wohl mit Profs.
    system ("pause"); und return 0; haben wir so gelernt und steht in allen Bsp. vom Prof. Wir arbeiten mit Visual Studio 2017, ohne system ("pause") schließt sich halt das Fenster immer direkt?!

    Vielen Dank nochmal!



  • @Dude sagte in Frage: Klasse - Variablen in Get-Methoden ohne Set-Methoden:

    system ("pause"); [...] haben wir so gelernt und steht in allen Bsp. vom Prof. Wir arbeiten mit Visual Studio 2017, ohne system("pause"); schließt sich halt das Fenster immer direkt?!

    Die verlinkte Frage auf StackOverflow samt Antworten lesen und dann in Visual Studio das Häkchen bei "Automatically close the console when debugging stops" unter Menü "Tools" ~> "Options" ~> "Debugging" ~> "General" wegmachen.



  • @Swordfish 😄 Haha, alles klar. Macht Sinn.



  • @Swordfish sagte in Frage: Klasse - Variablen in Get-Methoden ohne Set-Methoden:

    return 0; haben wir so gelernt

    Es ist ja nicht falsch, nur unnötig: [basic.start.main]/5



  • Und noch ergänzend zu @Swordfish Fehlerauflistung:

    Die strings in den Funktionen sollten const string& sein (oder von mir aus copy + move) und dass es keine Setter gibt, aber einen Default-Konstruktor wirkt auch erstmal unsinnig.
    Denglisch ist auch Mist. Insgesamt eine sehr schwache Vorlage von deinem Aufgabensteller.



  • @Swordfish sagte in Frage: Klasse - Variablen in Get-Methoden ohne Set-Methoden:

    @Swordfish sagte in Frage: Klasse - Variablen in Get-Methoden ohne Set-Methoden:

    return 0; haben wir so gelernt

    Es ist ja nicht falsch, nur unnötig: [basic.start.main]/5

    Ich finde es falsch, das überhaupt zu erwähnen. Bei allen anderen Funktionen im Quellcode verzichtet man ja auch nicht auf das explizite aufrufen von "return". Also sollte man sich das auch bei "int main( ... ) " gar nicht erst angewöhnen.
    Da gehört ein "return 0;" ( oder irgendein anderer Returncode ) hin. Punkt.



  • @It0101 "Geschmackssache", sagte der Affe und biss in die Seife.



  • @It0101 Also ich returne EXIT_SUCCESS. Macht es noch etwas klarer.



  • @Tyrdal Super, ein zusätzliches #include und eine Zeile Code mit 0 Effekt. main() läuft bis zum Ende durch? Alles gut und klar genug.



  • Ich streite mich ja gern über fast alles -- aber über return 0; vs. return EXIT_SUCCESS; vs. nix in main streiten ...
    Naja kann man machen, muss man aber nicht 🙂



  • @hustbaer sagte in Frage: Klasse - Variablen in Get-Methoden ohne Set-Methoden:

    Ich streite mich ja gern über fast alles -- aber über return 0; vs. return EXIT_SUCCESS; vs. nix in main streiten ...
    Naja kann man machen, muss man aber nicht 🙂

    Wenn man weiß was man tut, ist der Verzicht auf ein "return" in Ordnung. Ich finde es nur bekloppt, C++-Lernenden völlig grundlos von irgendwelchen möglichen Ausnahmen zu erzählen. Wäre das return ein zehnzeiliger Codeblock würde ich das verstehen, aber wegen einer Zeile Quellcode? come on! Die Spitze der Faulheit. Aus pädagogischer Sicht ist das Unsinn.



  • @It0101 Ja hast eh recht. Ich meinte das auch so ein bisschen in die Richtung. Also dass es von Anfang an nicht sehr sinnvoll war das in der Form zu erwähnen. Also ich finde das OK wenn man es bringt ala "übrigens, fun fact: in C und C++ muss man in main() kein return schreiben, aber nur in main() und keiner weiss so recht wieso es die Spezialregel immer noch gibt aber ist halt so".
    Es als Verbesserungsvorschlag zu bringen halte ich auch für wenig sinnvoll.


  • Mod

    @hustbaer sagte in Frage: Klasse - Variablen in Get-Methoden ohne Set-Methoden:

    @It0101 Ja hast eh recht. Ich meinte das auch so ein bisschen in die Richtung. Also dass es von Anfang an nicht sehr sinnvoll war das in der Form zu erwähnen. Also ich finde das OK wenn man es bringt ala "übrigens, fun fact: in C und C++ muss man in main() kein return schreiben, aber nur in main() und keiner weiss so recht wieso es die Spezialregel immer noch gibt aber ist halt so".
    Es als Verbesserungsvorschlag zu bringen halte ich auch für wenig sinnvoll.

    Das doofe ist ja, in C89 gibt es da keine Sonderregel (auch wenn es zu 99% trotzdem funktionieren wird) und es wäre falsch, das return weg zu lassen.



  • @SeppJ sagte in Frage: Klasse - Variablen in Get-Methoden ohne Set-Methoden:

    Das doofe ist ja, in C89 gibt es da keine Sonderregel (auch wenn es zu 99% trotzdem funktionieren wird) und es wäre falsch, das return weg zu lassen.

    Huch? Ich dachte immer das wäre ne Altlast die von C übernommen wurde. Auf jeden Fall wäre das sowas von einfach zu fixen gewesen (und ist es noch). Der Standard sagt ja eh immer nur "diagnostic required" (wenn überhaupt). Und das ist mit einer Warning erfüllt. D.h. die Compiler müssten lediglich mit Defaut-Switches ne Warning abliefern wenn sie conformant sein wollen - dürften den Code aber weiterhin akzeptieren und weiterhin ein Object-File erzeugen. Und dann hätte man eine sinnlose Sonderregelung weniger im Standard.


  • Mod

    Das ist wirklich eine gute Frage, wieso das so ist. Ich kann keine Antwort dazu finden. Wenn ich mal spekulieren darf: Mit C99 und C++ (die beide jeweils das implizite return 0; einführen) wurde der Rückgabewert von main zwangsweise zu int. In Vorstandardzeiten (und mit ein bisschen kreativer Auslegung auch in C89) war auch void erlaubt. Jetzt hätte diese Änderung vielen an sich sauberen Code kaputt gemacht, bloß wegen einer Standardisierung. So übersetzt aber der alte Code ohne return trotzdem noch (vielleicht mit ein bisschen Gemecker, dass es eigentlich int main lauten sollte) und die Laufzeitumgebung findet trotzdem noch ihren int-Rückgabewert wo sie ihn erwartet.

    Persönlich finde ich das auch recht programmiererfreundlich. Wenn ich selber eine Funktion mit Rückgabewert schreibe, dann denke ich darüber nach, was die Funktion zurückgeben soll. Da vergesse ich garantiert kein return. Bei main wird mir die Signatur aufgezwungen, und die meiste Zeit ist mir völlig Wumpe was die main zurück gibt. Ich muss mich sogar schon halbwegs gut mit Computern auskennen, um überhaupt die Bedeutung des Rückgabewerts von main zu kennen. Und selbst dann ist es mir die meiste Zeit immer noch egal. Da vergesse ich schnell das return (besonders 1989, als mir meine IDE nicht aggressiv den Code vervollständigt hat) aber mein Programm ist ja trotzdem richtig und ich will auch, dass es sich so verhält.



  • @SeppJ Hm. Das macht für mich immer noch keinen Sinn. Wenn ich den Code sowieso anpassen muss (weil ich void auf int ändern muss), dann kann ich auch gleich das return 0 dazuschreiben. Is dann auch schon wörscht.


Anmelden zum Antworten