Hilfe bei ersten simplen Programm mit Methoden und Klassen. Letzte frage zu Initialisierung...
-
danke. ich schau mal.
was meinst du mit hinzufügen?
also es steht links bei den Quelldateien...
-
Klassische "Alles muss eine Klasse sein"-Krankheit.
#include <stdio.h> int main(int argc, char *argv[]){ unsigned int minuten; if (!fscanf(stdin, "%u", &minuten)) return printf("falsche Eingabe\n"); printf("%d:%02d\n", minuten / 60, minuten % 60); return 0; }Wenn du eine Wahl hast beschäftige dich mit irgendwas, was mit Objekten zu tun hat, sonst wirst du an C++ keinen Spaß haben.
-
nwp3 schrieb:
Klassische "Alles muss eine Klasse sein"-Krankheit.
#include <stdio.h> int main(int argc, char *argv[]){ unsigned int minuten; if (!fscanf(stdin, "%u", &minuten)) return printf("falsche Eingabe\n"); printf("%d:%02d\n", minuten / 60, minuten % 60); return 0; }Wenn du eine Wahl hast beschäftige dich mit irgendwas, was mit Objekten zu tun hat, sonst wirst du an C++ keinen Spaß haben.
Klassische "Ich verwechsle C mit C++" Krankheit.
-
wie gesagt das war die erste Übung.
und die Minuten.h war quasi schon so vorgegeben.
wir sollen das halt mit dem OOP von anfang an lernen ...
-
Dir fehlen krasse Grundlagen. Eigentlich solltest du dir jetzt einfach ein Buch holen, durcharbeiten und erst wieder fragen wenn du die Grundlagen beherrschst.
Aber ich helf dir mal so.
Ziel ist es minuten ein und Stunden:Minuten auszugeben. (in: 130 out: 2:10)
mir geht es jetzt darum, erstmal dieses Programm ans laufen zu bekommen, eine eingabe einzulesen, den Wert in Std:Min auszugeben und fertig.
Das ist gut. Aber du machst es dir viel zu kompliziert. Wieso gleich eine Klasse dafür schreiben? Das macht hier keinen Sinn. Klassen benutzt man nicht um eine Gruppe von Funktionen zusammenzufassen (außer in bspw. Java, aber das hier ist C++).
Dafür würde man Namespaces verwenden, aber da du noch weit davon entfernt bist, mach alles mal lieber ohne beides.Frage 1: was sagt mir dieser fehler/ wie behebe ich ihn
Hmm:
da diese ja in der Klasse minuten stehen habe ich es mit dem "Minuten::" versucht aufzurufen
1. Um eine Memberfunktion einer Klasse aufzurufen brauchst du, solange sie wie in deinem Fall nicht
staticist, eine Instanz.
Du behandelst hier eine Klasse wie einen Namensraum. Wenn du einen willst, dann nimm' ihn auch!
Und setz' dich bitte ein wenig mit OOp auseinander, du hast ja grundsätzlich falsche Vorstellungen.
2. Um eine Funktion aufzurufen musst du unabhängig davon wie sie aussieht immer eine Parameterliste angeben.
Wenn die Funktion keine Parameter nimmt, dann ist die Liste eben leer (also einfach ein Klammerpaar "()"), aber sie ist immer noch da.Frage 2: würde das denn Grundsätzlich so gehen oder sind da irgendwelche groben fehler drin?
"grobe Fehler"? Naja, wenn du schon so fragst: Ja.
Das Design ist auch völliger Blödsinn, s. o.
Aber das löst sich alles von selbst sobald du mal ein Grundlagenbuch durchgeackert hast.Eigentlich könnte man alles ganz kurz in der
main()lösen:#include <iostream> int main() { std::cout << "Minuten: "; unsigned i; if(std::cin >> i) ///Wenn das Einlesen erfolgreich war, dann ergibt dieser Ausdruck zu bool konvertiert 'true', sonst 'false' std::cout << "Umgerechnet sind das " << i / 60 << " Stunden und " << i % 60 << " Minuten." << std::endl; /// Das ist einfache Mathematik, einfach mit Blatt und Stift nachrechnen }Der Trick bei diesem Code ist u. a., dass Divisionen mit Ganzzahl-Typen in C++ immer abgerundet werden, bzw. der Nachkommateil fällt weg. Dadurch ergibt er Ausdruck 200 / 60 bspw. 3, weil 3.333... einfach abgerundet wird.
O_______O schrieb:
...
Bitte keinen Scheiß posten, danke.
out schrieb:
nwp3 schrieb:
[garbage]
Klassische "Ich verwechsle C mit C++" Krankheit.

So eine Kacke muss man sich hier auch noch reinziehen...
-
wie gesagt wir sollen es so machen...
ich habe auc versucht eine instanz aufzurufen in main
aber er unterstreicht es mir rot.
[code="cpp"]Minuten Instanz1;
cout << "Geben Sie die Zeit in Minuten ein: " << endl;
Minuten::eingabe();
Minuten::berechneMinuten();
Minuten::berechneStunden();
Minuten::ausgabe();
[/code]die u /u sind rot unterstrichen
-
Versuchs mal mit Instanz1.eingabe() statt Minuten::eingabe().
-
jetzt ist nur noch Instanz1 oben unterstrichen. Also nach Minuten
-
Hast du das #include "Minuten.h" vergessen? Vielleicht vertippt?
Gib nicht so viel auf die rote Linie, die ist auch manchmal falsch. Einfach kompilieren und Fehlermeldung mit in den Beitrag kopieren.
-
spell schrieb:
jetzt ist nur noch Instanz1 oben unterstrichen. Also nach Minuten
So wie du deine Klasse Minuten umgesetzt hast, brauchst du eine Instanz der Klasse um die Methoden verwenden zu können.
Statt
cout << "Geben Sie die Zeit in Minuten ein: " << endl; Minuten::eingabe; Minuten::berechneMinuten; Minuten::berechneStunden; Minuten::ausgabe;müsstest du das schreiben:
Minuten meineMinuten; // eine Instanz der Klasse Minuten anlegen cout << "Geben Sie die Zeit in Minuten ein: " << endl; meineMinuten.eingabe(); meineMinuten.berechneMinuten(); meineMinuten.berechneStunden(); meineMinuten.ausgabe();
-
Ach so, da sind noch ein paar Kleinigkeiten.
Hast du in der Minuten.cpp und main.cpp #include <iostream> verwendet?
Hast du using namespace std; verwendet? Besser std::cout statt nur cout hinschreiben. Dasselbe natürlich für std::cin und std::endl;
Und ganz wichtig ist ein Fehler in der "Minuten.h". Du deklarierst dort nämlich den Destruktor im private: Bereich. Das geht nicht.
~Minuten() muss auch unter public: stehen.Hoffe das hilft.

-
Ich habe die #include "stdafx.h" und die #include "Minuten.h"
inder stdafx.h hab ich drin:
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#include <iostream>
using namespace std;(hhab schon gelesen das mann das namespace wohl nich in die h machen sollte. aber sei jetzt erstal dahingestellt.
hmpff schrieb:
Und ganz wichtig ist ein Fehler in der "Minuten.h". Du deklarierst dort nämlich den Destruktor im private: Bereich. Das geht nicht.
~Minuten() muss auch unter public: stehen.Hoffe das hilft.

das war es. danke
ich habe einfach die vorlage die wir bekommen haben in die minuten.h kopiert und da stand das mit dem kon-/ und de-struktor schon drin ..
-
wenn jetzt noch eine Abfrage hinzukommen soll, ob ein gültiger integerwert eingegeben wurde, muss ich dann die minuten als char einlesen, dann über diese ACII tabelle abfragen ob der wert zwischen x und y liegt (in dieser tabelle) und mit, ich glaube atoi(), in einen integer umwandeln?
oder gibts da in c++ nich irgendwas eleganteres ala "if (minuten =! int) break; oder so?
des weiteren wollte ich in der Main() eine while(1) Schleife reinmachen und die break Bedinung in einer Methode abbruch() in der Minuten.cpp einbinden, was aber wohl nicht geht...
wenn ich in der Main.cpp die minuten abfragen will, geht dies aber auch nicht weil sie private sind ...
gibts da was?
achja
"unsigned int Minuten::minutenTotal = minutenTotal + minuten;"
geht auch nicht

-
spell schrieb:
wenn jetzt noch eine Abfrage hinzukommen soll, ob ein gültiger integerwert eingegeben wurde, muss ich dann die minuten als char einlesen, dann über diese ACII tabelle abfragen ob der wert zwischen x und y liegt (in dieser tabelle) und mit, ich glaube atoi(), in einen integer umwandeln?
oder gibts da in c++ nich irgendwas eleganteres ala "if (minuten =! int) break; oder so?
if(std::cin >> minuten) std::cout << "Eingabe richtig\n"; else std::cout << "Eingabe falsch\n";Wenn nämlich in eine int-Variable eingelesen werden soll und die Eingabe nicht passt geht cin in einen Fehlerzustand. Den kann man abfragen.
spell schrieb:
des weiteren wollte ich in der Main() eine while(1) Schleife reinmachen und die break Bedinung in einer Methode abbruch() in der Minuten.cpp einbinden, was aber wohl nicht geht...
Willst du bei einer falschen Eingabe die Schleife in der main unterbrechen, oder was ist der Zweck der Sache?spell schrieb:
wenn ich in der Main.cpp die minuten abfragen will, geht dies aber auch nicht weil sie private sind ...
gibts da was?
Mach minuten public oder füge eine Methode hinzu, die dir den Wert von minuten zurückgibt.
-
spell schrieb:
oder gibts da in c++ nich irgendwas eleganteres ala "if (minuten =! int) break; oder so?
Sag mal liest du meine Posts überhaupt?

Das ist doch echt unglaublich.Sone schrieb:
if(std::cin >> i) ///Wenn das Einlesen erfolgreich war, dann ergibt dieser Ausdruck zu bool konvertiert 'true', sonst 'false'
-
hab ich überlesen bzw konnte zu dem Zeitpunkt nichts mit anfangen.
Es will alles et so wie ich will ...
habe ein get_eingabe hinzugefügt was die minuten enthalten soll weil die ja private sind ... (war halt schon so vorgegeben).. aber auch wenn ich die publi mache ändert das nichts am ablaufMinuten.h
class Minuten { public: void eingabe(); unsigned int get_eingabe; unsigned int berechneStunden(); unsigned int berechneMinuten(); void ausgabe(); unsigned int minutenTotal(); private: unsigned int minuten; };Minuten.cpp
void Minuten::eingabe() { cin >> minuten; unsigned int get_eingabe=minuten;} unsigned int Minuten::berechneStunden() {return (minuten/60);} unsigned int Minuten::berechneMinuten() {return (minuten%60);} void Minuten::ausgabe() { cout << Minuten::berechneStunden() << ":" << Minuten::berechneMinuten() <<endl; } unsigned int Minuten::minutenTotal() { unsigned int minutenTotal; return (minutenTotal = minutenTotal + minuten);}Main.cpp
int _tmain(int argc, _TCHAR* argv[]) { while(1){ Minuten Instanz; cout << "Geben Sie die Zeit in Minuten ein: " << endl; if (cin >> Instanz.get_eingabe) { Instanz.eingabe(); Instanz.berechneMinuten(); Instanz.berechneStunden(); Instanz.ausgabe(); } else (cout << "Eingabe beendet. Minuten Total: \n" << Instanz.minutenTotal() << endl); break; } system ("PAUSE"); return 0; }er soll halt einfach die Schleife solange durchlaufen bis irgendein zeichen eingegeben wurde. Dann sollen die gesamteingegebenen minuten ausgegeben werden und das programm soll beendet werden...
Akuell passiert folgendes:
erste zahl eingeben -> enter -> nix passiert
zweite zahl eingeben -> enter -> normale ausgabe in std:min
dritte zahl nicht möglich. "drücken sie eine beliebige taste bla bla..."
-
spell schrieb:
Es will alles et so wie ich will ...
...
er soll halt einfach die Schleife solange durchlaufen bis irgendein zeichen eingegeben wurde. Dann sollen die gesamteingegebenen minuten ausgegeben werden und das programm soll beendet werden...
Akuell passiert folgendes:
erste zahl eingeben -> enter -> nix passiert
zweite zahl eingeben -> enter -> normale ausgabe in std:min
dritte zahl nicht möglich. "drücken sie eine beliebige taste bla bla..."Das ist halt das blöde an C++: es macht nicht, was man will, sondern was man programmiert.
Wenn man in zwei Variablen etwas einliest, muss man eben zwei mal etwas eingeben. Und wenn man break in eine Endlosschleife schreibt, wird sie beendet.
-
sie soll ja nur beendet werden wenn kein gültiger integerwert eingegeben wurde...
edit: oh das break war falsch....
if (cin >> Instanz.get_eingabe) { Instanz.eingabe(); Instanz.berechneMinuten(); Instanz.berechneStunden(); Instanz.ausgabe(); } else {cout << "Eingabe beendet. Minuten Total: \n" << Instanz.minutenTotal() << endl; break;}so .. nun läuft es weiter. aber leider ließt er nur jede zweite zahl ...
http://www.abload.de/img/clipboard-hp4672ozqee.jpg
also liegt das daran weil ich im main() dieses cin für die korrekte abfrage habe und dann nochmal das cin in der methode .. hab jetzt einfach in der methode geschrieben minuten=get_eingabe
dann passt jetzt alle bis auf die total minuten... wahrscheinlich weil ich sie immer =0 setze nach jedem durchlauf .. aber wo initialisier ich sie denn sonst? wenn ich das =0 weglasse, spuckt er immer irgend n rießen zahl aus... MUSS ich das jetzt mit nem konstruktor machen?
-
keiner ne Idee?
Ich müsste es halt evtl außerhalb der Schleife initialisieren..
Aber wie genau schreibt man das dann? Minuten::minutentotal_=0; geht leider nicht
-
Hallo,
im Konstruktor der Minuten-Klasse minutentotal_ auf Null setzen, in Minuten::eingabe() kannst du dann die aktuell eingegebenen Minuten zu minutentotal_ addieren.
MfG,
Probe-Nutzer