C++ Methode mit dem Rückgabetyp Klasse



  • Guten Tag,

    ich habe es wirklich versucht, aber leider bin ich der Aufgabe nicht gewachsen.
    Ich habe versucht etwas im Forum zu finden, aber ich weiß auch nicht genau, nach was ich eigentlich suchen soll. Ich muss dazu sagen, dass ich ein C++-Anfänger bin und mir wirklich schwer tue mit professionellen Lösungen - vorallem wenn diese viele Abkürzungen enthalten. Eine einfache Erklärung wäre also wünschenswert.

    int main ()
    {
        Bruch A(10,5), B(10,2);
        A.ausgabe();
        A.BruchKuerzen().ausgabe();
    }
    

    Mir geht es eigentlich nur um die dritte Anweisung im Main-Block.
    In der Klasse Bruch lautet die Spezifikation für die Anweisung:

    Bruch BruchKuerzen();

    Es handelt sich um eine Vorgabe und muss in der Klasse und in der Main-Funktion genau so aussehen.

    Ich möchte hier nicht meine Studien-Aufgaben delegieren. Die ganze Aufgabe ist fast fertig und alles funktioniert soweit. Das Problem ist, dass der Bruch nur lokal in BruchKuerzen richtig verarbeitet wird.

    Beim Aufruf in der Main-Funktion A.BruchKuerzen().ausgabe(); stimmt nur der Nennner. Der Zaehler wird wahrscheinlich irgendwo zufällig aus dem Speicher geholt und hat einen sehr hohen Wert.

    Ich habe mit Zeigern/Referenzen, This-Zeigern und Kopierkonstruktoren herumexperementiert. Ich finde einfach keine Lösung und keine Hilfe. Kann mir jemand helfen?
    Die tatsächliche Aufgabe ist viel größer und ich habe nur bewusst Aussschnitte genommen, da ich es gerne selbst lösen möchte.



  • Das sollte normalerweise völlig problemlos auf naive Art und Weise funktionieren:

    Bruch BruchKuerzen() const {
      Bruch result(*this);
      // ... Euklidischer Algorithmus etc.
      return result;
    }
    

    Vielleicht postest du mal mehr Code. Auch die Klasse.



  • Vergleich mal deinen Code hiermit:

    #include <iostream>
    
    class Bruch
    {
    private:
    	int zaehler, nenner;
    
    	static int ggTBerechnen(int a, int b)
    	{
    		int temp;
    		while (b)
    		{
    			temp = a; 
    			a = b; 
    			b = temp % b;
    		}
    		return a < 0 ? -a : a;
    	}
    
    public:
    	Bruch(int zaehler, int nenner)
    		: zaehler(zaehler), nenner(nenner)
    	{ }
    
    	Bruch kuerzen()
    	{
    		int teiler = ggTBerechnen(zaehler, nenner);
    		return Bruch(zaehler / teiler, nenner / teiler);
    	}
    
    	void ausgeben()
    	{
    		std::cout << "(" << zaehler << ", " << nenner << ")\n";
    	}
    };
    
    int main () 
    { 
        Bruch a(10,5), b(10,2); 
        a.ausgeben(); 
        a.kuerzen().ausgeben(); 
    }
    

    Ein paar Stiltipps:
    - Es ist nicht notwendig in einem Memberfunktionsnamen den Namen der Klasse zu wiedereholen - dass du einen Bruch kürzt ist beim Aufruf von kuerzen() auf ein Bruchobjekt klar.
    - Funktionen sollten möglichst Verben als Namen haben. Also nicht "ausgabe" sondern "ausgeben".
    - Deutsch programmieren ist nicht die feine Art aber für die Schule okay.
    - Variablennamen möglichst nicht mit Großbuchstaben beginnen.



  • Falls Du Deine Sachen schon zerlegt hast in mehrere *.cpp- und *.h-Dateien, dann mach sie wieder zusammen zu einer Datei.
    Mach alles Betriebssystemspezifische weg wie "system("PAUSE")".

    Also mach eine einzige C++-Datei, die das gesamte Programm enthält, und die möglichst alle Forenleser auch schnell reinkopieren und ausprobieren können, egal ob Windows/Linux-User oder Mac-Opfa.

    Und beschreibe möglichst genau, was die Ausgabe des Programms sein sollte und was die Ausgabe bei Dir ist. Je nachvollziehbarer, desto mehr Helfer kriegste, die sich zwar niocht die Mühe machen würden, deinen Code zu compilieren und auszuprobieren, aber bei treffender Fehlerbeschreibung sich einfach dran erinnern, so einen auch schon mal gemacht zu haben und ihre Erfahrung schnell mal posten, wenn sie zu Deinem Code passt.

    Du wirst so in Nullkommanix eine Antwort kriegen, die das Problem löst. 👍

    Sorry, ist nicht bös gemeint, daß ich mehr Input wünsche.



  • volkard schrieb:

    Falls Du Deine Sachen schon zerlegt hast in mehrere *.cpp- und *.h-Dateien, dann mach sie wieder zusammen zu einer Datei.
    Mach alles Betriebssystemspezifische weg wie "system("PAUSE")".

    Also mach eine einzige C++-Datei, die das gesamte Programm enthält, und die möglichst alle Forenleser auch schnell reinkopieren und ausprobieren können, egal ob Windows/Linux-User oder Mac-Opfa.

    Und beschreibe möglichst genau, was die Ausgabe des Programms sein sollte und was die Ausgabe bei Dir ist. Je nachvollziehbarer, desto mehr Helfer kriegste, die sich zwar niocht die Mühe machen würden, deinen Code zu compilieren und auszuprobieren, aber bei treffender Fehlerbeschreibung sich einfach dran erinnern, so einen auch schon mal gemacht zu haben und ihre Erfahrung schnell mal posten, wenn sie zu Deinem Code passt.

    Du wirst so in Nullkommanix eine Antwort kriegen, die das Problem löst. 👍

    Sorry, ist nicht bös gemeint, daß ich mehr Input wünsche.

    Sein wann bist du denn so human volkard? 😮



  • Ethon schrieb:

    Vergleich mal deinen Code hiermit:

    Sehr gute Idee, nicht auf Code von Trashcode zu warten, sondern ein schon objektorientiertes Minimalbeispiel zu posten. 👍

    Ethon schrieb:

    Ein paar Stiltipps:
    - Es ist nicht notwendig in einem Memberfunktionsnamen den Namen der Klasse zu wiedereholen - dass du einen Bruch kürzt ist beim Aufruf von kuerzen() auf ein Bruchobjekt klar.
    - Funktionen sollten möglichst Verben als Namen haben. Also nicht "ausgabe" sondern "ausgeben".
    - Variablennamen möglichst nicht mit Großbuchstaben beginnen.

    Jupp!

    Ethon schrieb:

    - Deutsch programmieren ist nicht die feine Art aber für die Schule okay.

    Ich halte es da so, daß ich Klassen und Funktionen, die sich echt wiederverwendbar anfühlen, wie Bruch=>Rational auf englisch mache, aber Sachen, die in der lokalen deutschen Anwendungsdomäne bleiben wie drosselKlappenOeffnungsWinkel auf deutsch halte. Insbesondere habe ich dabei eine sprachliche Schichtentrennung zwischen tools und Anwendungslogik. Meistens, fast immer, also außer wenn der Auftraggeber englischen Code fordert (noch nie erlebt) oder englische Doku fordert (oft, und dann wärs ja Irrsinn, auf deusch zu proggern, dann kommen aber auch keine Begriffe vor, wo man nach der Übersetzung suchen müßte).



  • Danke für die schnellen Antworten.
    Danke auch für die Stiltipps - ich werde sie mir zu Herzen nehmen und für meinen Code so umsetzen.

    Nur habe ich die Aufgabe so aus der UML-Spezifikation entnommen und es muss in diesem Fall leider genau so dastehen, wie oben angegeben.

    Mein Code funktioniert jetzt dank Euch und ich kann die Aufgabe abschließen.
    Das sieht alles kinderleicht aus, aber wenn solche Beispiele in meinen Büchern oder Studienheften nicht drin stehen, ist es für mich sehr schwierig.

    Da Ethon im Prinzip die Lösung für einen solchen Aufruf hat, ist das Thema für mich erledigt. Somit erübrigt sich auch mein Code, da er bis auf die fehlenden Rückgaben der Brüche sehr ähnlich war.

    HerzLiche Grüße
    Trashcode (der Name ist derzeit noch sehr treffend)



  • volki schrieb:

    Skym0sh0 schrieb:

    Sorry, ist nicht bös gemeint, daß ich mehr Input wünsche.

    Sein wann bist du denn so human volkard? 😮

    Zu Nubes immer, Du Depp. 🤡

    Ich hab noch nie soweit ich mich erinnere zum Beispiel einen Link auf die Netikette oder auf HowToSmartQuestion oder so statt einer Antwort gesetzt. Das würde *mich* nämlich ankotzen, so einen Standardtext zu kriegen. Wir sind ja nicht auf einer Behörde hier. Da ich gerade quasi so einen abgesetzt hatte, aber alles handgeschrieben ohne Textbausteine, aber doch so blaffiernend fast, weils so *viele* Forderungen vor der Antwort sind, fühle ich mich genötigt, den TO zu motivieren, an der Stange zu bleiben.



  • volkard schrieb:

    Ich halte es da so, daß ich Klassen und Funktionen, die sich echt wiederverwendbar anfühlen, wie Bruch=>Rational auf englisch mache, aber Sachen, die in der lokalen deutschen Anwendungsdomäne bleiben wie drosselKlappenOeffnungsWinkel auf deutsch halte. Insbesondere habe ich dabei eine sprachliche Schichtentrennung zwischen tools und Anwendungslogik. Meistens, fast immer, also außer wenn der Auftraggeber englischen Code fordert (noch nie erlebt) oder englische Doku fordert (oft, und dann wärs ja Irrsinn, auf deusch zu proggern, dann kommen aber auch keine Begriffe vor, wo man nach der Übersetzung suchen müßte).

    Entwickelst du denn nur allein bzw mit anderen deutschen Entwicklern?
    Bei uns ganz normal dass auch nicht-deutsche Entwickler mal dabei sind.


Anmelden zum Antworten