Objektorientierte Programmierung, Ausgabe ist nicht korrekt.

DerTrojaner

Mitglied
Hallo zusammen,
ich habe ein kleines Problem. Und zwar habe ich eine recht einfache Aufgabe gestellt bekommen, aber leider finde ich nicht den Fehler in meinem Quellcode, der Compiler findet keinen Fehler, aber das Ergebnis ist total falsch. Ich hoffe das mir jemand helfen kann und mir sagen kann wo der Fehler liegt.
1eb2b6665e4e00b156e28bd16a8f25d3.png

C++:
#include <iostream>
using namespace std;

class Rechteck {
  
    private:
       int breite;
       int hoehe;
   public:
      Rechteck(int , int);
       int getBreite();
       int getHoehe();
       void setBreite ( int breite);
       void setHoehe(int hoehe);
       void flaeche();
};

Rechteck::Rechteck(int b, int h=4) {
   breite = b;
   hoehe = h;
}

int Rechteck::getBreite() {
  return breite;
}

int Rechteck::getHoehe() {
  return hoehe;
}

void Rechteck::setBreite( int b) {
  if (breite > 0) {
    breite = b;
  }
}

void Rechteck::setHoehe(int h) {
  hoehe = h;
}

void Rechteck::flaeche() {
  breite * hoehe;
}

main()
{
    int breite;
    int hoehe;
    int flaeche;
    cout <<"Geben sie die Breite an"<<endl;
    cin >>breite;
    cout << "Flaeche=" << flaeche <<endl;
    system("pause");
}
 

Technipion

Erfahrenes Mitglied
Öhm, naja schau mal, du machst dir die ganze Arbeit und erstellst eine Klasse "Rechteck", aber in deiner main() benutzt du ja gar kein Rechteck sondern nur 3 eigenständige Integer. In Zeile 52 wo du flaeche ausgibst, hast du flaeche ja noch gar keinen Wert zugewiesen?
 

DerTrojaner

Mitglied
Ich bin leider nicht der beste was Programmieren angeht und ich wollte mich halt mit der Aufgabe auf die Klausur vorbereiten.
 

cwriter

Erfahrenes Mitglied
Ich bin leider nicht der beste was Programmieren angeht und ich wollte mich halt mit der Aufgabe auf die Klausur vorbereiten.
Das ist durchaus löblich :)
Bedenke aber, dass Technipion der Legende nach auch eigene Verpflichtungen hat. Daher kann er nicht immer sofort antworten - Geduld :)

Oder ich übernehme einfach:
Ja. Du erstellst ja keine Instanz der Klasse "Rechteck" in der main. Woher soll nun der Wert kommen? Es macht auch keinen Sinn, die Fläche einfach so zu deklarieren, ohne einen Wert zuzuweisen - du willst ja die Fläche aus deiner Rechteck-Klasse (bzw. einer Instanz davon) bekommen.

aber das Ergebnis ist total falsch.
Wie überprüfst du das? Ausgabe? Die Variable "flaeche" hat keinen zugewiesenen Wert. Daher beinhaltet sie den Wert, der vorher an der Speicherposition stand - oft ist der 0, manchmal aber auch irgendetwas.

Dann hast du noch ein Problem im Konstruktor der Klasse selbst: breite > 0 wird dort gar nicht erzwungen.
Der Codestil ist etwas antiquitiert, es geht moderner und besser (=schnellerer Code), aber lösen wir erst einmal dein Problem:

C++:
main()
{
    int breite;
    int hoehe;
    int flaeche;
    cout <<"Geben sie die Breite an"<<endl;
    cin >>breite;

    // Hier fehlte es:
    Rechteck rechteck(breite, hoehe);
    flaeche = rechteck.flaeche();
    // Ende der Einfügung

    cout << "Flaeche=" << flaeche <<endl;
    system("pause");
}

Du wirst feststellen, dass die UML constraints nicht eingehalten werden. Grund: Der Konstruktor prüft keine Regeln. Wie du das fixen willst, überlasse ich erst einmal dir :)

Gruss
cwriter
 

DerTrojaner

Mitglied
Ich habe natürlich auch selber versucht es zu lösen... :D aber hat auch nicht viel gebracht :D
Ich schaue mir mal dein Beitrag erstmal genauer an weil muss erstmal studieren was du meinst, trotzdem vielen Dank
C++:
    Rechteck R();
    B = R.getBreite();
    H = R.getHoehe();
    Flaeche = R.flaeche();
  
    cout <<"Geben sie die Breite an"<<endl;
    cin >>R.B;
    cout << "Flaeche=" << flaeche <<endl;
    system("pause");
 

DerTrojaner

Mitglied
Habe es nun Rückgängig gemacht und trdz kommt der Fehler, habe danach gegoogelt viele meinten es fehlt ein ; oder eine Klammer ?

Und eine Frage hätte ich noch was genau bewirkt die Zeile 53 ?
da63bc6d8224fffe7e8cbf8faa88b6d4.png
 

cwriter

Erfahrenes Mitglied
Habe es nun Rückgängig gemacht und trdz kommt der Fehler, habe danach gegoogelt viele meinten es fehlt ein ; oder eine Klammer ?
Der Fehler ist in der Klassendefinition. Dort hast du ein "void flaeche()", das ein "int flaeche()" sein müsste.
Dein
C++:
void Rechteck::flaeche() {
  breite * hoehe;
}

// Sollte sein:
int Rechteck::flaeche() {
  return breite * hoehe;
}

Ein Wort dazu: Du nutzt einen Compiler aus dem Jahr 2000? Bist du im Museum eingebrochen, um an den heranzukommen?
(Generell: Wenn nicht irgendein ewiggestriger Professor Uralt-Technologie vorschreibt, nimm eine moderne Alternative. Unter Windows macht Visual Studio am wenigsten Probleme, Linux ist mit g++ bzw. clang noch etwas besser aufgestellt. Diese gehen mit WSL auch auf Windows für kleine Programme sehr gut)
(Es macht alles ein bisschen schwieriger, da Borland nicht mehr wirklich genutzt wird - entsprechend sind die Fehlermeldungen kryptischer und man kann weniger nachschlagen - ganz zu schweigen von der hoffnungslos veralteten Sprache dahinter (das wird etwa C++99 sein - aktuell ist C++17, ganz neu C++20).

Und eine Frage hätte ich noch was genau bewirkt die Zeile 53 ?
Sie ruft den Konstruktor von Rechteck auf und erstellt damit eine Instanz von "Rechteck" namens "rechteck". Wenn dir das nicht klar ist, musst du es sagen - dann repetieren wir die Grundlagen.

Gruss
cwriter
 

Neue Beiträge