Array von Objekten an Funktionen übergeben
-
@Jonas
Danke für die Erklärung, es ist echt unbefriedigend was zu programmieren was ich dann nicht mehr wiederholen kann...
@cooky451
Auch dir danke für deinen Hinweis, das denke ich ist mir klar...
Wegen dem Code posten, kann ich auch Dateien hochladen..? Es ist schon ziemlich viel Code...
..alles peinlich genau kommentiert, da gibt´s Punkte drauf...
..aber dass lösch ich dann halt raus... 
Wie macht ihr das mit den Kommentaren..? Teilweise hab ich schon Code ganz ohne gesehen, ist das nur schwierig weil ich Neuling bin..??
-
..sorry, es ist auch schon spät..gemeint war ob das nur schwierig für mich zum leesn ist, weil ich Neuling bin...

Gute Nacht, morgen geht´s weiter...

-
Eisenspitze schrieb:
Wie macht ihr das mit den Kommentaren..?
Den meisten Anfängern wird leider nur gesagt: Kommentiert viel und alles! Kommentare sind toll! (Könnte ein Zitat von meinem Informatiklehrer sein..)
Aber wie und was man kommentiert wird völlig vernachlässigt. Denn viel wichtiger ist: Kommentieren warum man etwas macht und nicht was man macht, denn das steht ja im Code. Es gibt nichts Schlimmeres als:int main() { // Datei öffnen std::ifstream file("blubb.txt"); // Aus Datei lesen std::string s; file >> s; // ... }Das ist schon mal die Grundregel. Weiter geht es mit: Großflächig kommentieren. Vielleicht vor eine lange Funktion/Klasse schreiben was sie macht, aber nicht jede Zeile kommentieren. Du darfst ruhig davon ausgehen, dass derjenige der den Code liest C++ kann, sonst hilft auch kein Kommentar mehr. Einzelne Zeilen nur dann kommentieren, wenn du denkst dass sie schwer verständlich sind. Und auch dann an die erste Regel denken: Kommentieren warum man etwas macht und nicht was man macht.
Und nein, man kann hier nichts hochladen. Solange du nicht schon wie deine Kollegen 600 Zeilen Code hast, poste es einfach hier. Ansonsten lade es halt irgendwo hoch. Oder nutze gleich Seiten wie http://pastebin.com .
-
@cooky541: Sorry, du bietest dich halt als Pi an :p

@Eisenspitze: Wie gesagt, wenns nicht übermäßig lang ist Poste es einfach, ansonsten lads irgendow hoch.
Zum hierposten: Wesentliche kommentare dürfen drin bleiben (z.B. die Beschreibung was eine Funktion von dier tut (bzw. tuen sollte) aber unwesentliches (z.B. dass man mit ofstream Dateien schreiben kann) fliegt raus. Außerdem solltest du den Code auf die Funktion in der der Fehler (vermutlich) auftritt sowie ihren Aufruf reduzieren. Beim Aufruf solltest du aber auch den für den Aufruf wichtigen Code mitposten, z.B. wie bestimmte Variablen initialisiert werden.
-
Danke für den Tipp, der ist echt gut.
Die Dateien habe ich hochgeladen, sorry dass ich auch hier ein Neuling bin, ich hab´s bei Megaupload hochgeladen:
-
stopp, falscher Button..!
SORRY, da kommt noch mehr... 
und außerdem komme ich mit Megaupload nicht zurecht...

main: http://www.loaditup.de/677835-s2k64rptp2.html
O-Klasse Zimmer: http://www.loaditup.de/677836-8sq56q8cks.html
U-Klasse Einzel: http://www.loaditup.de/677837-7n5zn6wx55.html
U-Klasse Doppel: http://www.loaditup.de/677838-26xxm9hkt5.htmlHeader Funktionen: http://www.loaditup.de/677844-qfavzvmw3k.html
Menü Zimmerstati: http://www.loaditup.de/677839-wdba8vwpxx.html
Stati gefragte Zimmer: http://www.loaditup.de/677841-5vtr89n2df.html
Menü Zimmerbelegen: http://www.loaditup.de/677840-ueu3vqb6n7.html
Zimmer belegen: http://www.loaditup.de/677842-gtravuvtsv.htmlZimmernummer eingeben: http://www.loaditup.de/677843-c42nxr4834.html
So läuft bisher alles, fertig bin ich noch nicht ein paar Punkte fehlen noch.
-
@Eisenspitze: Es gibt eine Editieren-Funktion. Der Link is bei deinen eigenen Beiträgen rechts in der Titelzeile. So kannst du's wettmachen, mal den falschen Button gedrückt oder etwas falsch geschrieben zu haben.
Die Links muss ich erstmal durchgucken.
-
Kritikpunkte zu main.cpp:
- system("cls");
- Zu viel system("Pause") (warum brauchst du das eig.)?
- Cahr-Array mit der Länge 1 benutzt (das '\0'-Zeichen am Ende eines Strings benötigit dieses Byte, in das variabel lange Strings eingelesen werden, d.h. schon wenn charMenupunkt[0] != '\0' ist hast du in Speicher geschrieben, der dir nicht gehört),
- die Umwandlung von char[] nach std::string ist völlig sinnlos und
- deine Plausiblitätsprüfung ist auch nicht unbedingt geignet. Das Problem gekürzt sieht so aus:
string strMenupunkt; cin >> strMenupunkt; //entweder switch(strMenupunkt[0]) { //... } //oder if(strMenupunkt == "1") { } else if(strMenupunkt == "2") { } //... else cout << "Fehlerhafte Eingabe\n";Kritikpunkte Zimmer.h:
- NIEMALS using namespace std; in Header-Dateien
- Für alles Strings zu verwenden ist nicht immer sinnvoll, stdrBelegt könnte man z.B. zu bool bBelegt; machen
- belegen könnte man folgendermaßen verbessern:
void belegen() { bool bEingabeOk = false; bBelegt = true; //nur wenn du Tipp2 beachtest, ansonsten wie gehabt while (!bEingabeOk) { cout << "Bitte den Vor- und Nachname des Gastes eintragen.\n"; cout << " > "; getline(cin, strGast); if (strGast.length() < 5) { cout << "Bitte geben Sie einen gültigen Namen ein\n"; } else bEingabeOk = true; } }- Zimmerdatenausgeben könnte man virtual machen, um es in der Abgeleiteten Klasse zu überschreiben
- Die Funktionen für die Zimmernummererzeugung könnte man pure vritual machen
Kritikpunkte zu Einzelzimmer.h (und damit auch zu Doppelzimmer.h, ich gucks mir nicht erst an, weils wahrscheinlich sehr änlich ist):
- Die Funktion Zimmernummer erzeugen funktioniert nur von 1 bis 10. Bei Stringstream kann man doch die Breite und das Füllzeichen einstellen.
- Für eine Bessere OO nehm dir die Tipps von Zimmer.h zu herzen und bastel so die Klasse mit den Überschreibungen um
Headerfunktionen: Bis auf using namespace erstmal keine Kritik. Aber mal Zwischenfrage, hat es einen Grund, warum du hier nie Parameternamen mitgiebst?
MenuZimmerstati.cpp, MenuZimmerbelegen.cpp, Zimmernummereingeben.cpp: siehe Kritik zu main
StatiGefragteZimmer.cpp: system("cls"); und müsste natürlich angepasst werden wenn Änderung von Zimmer-Klasse durchgeführt wird.
Zimmerbelegen.cpp: soweit keine Kritik
-
Danke das mir deine Zeit schenkst und deine vielen Tipps..!

Hab die Aufgabe jetzt schon abgeben, weil´s heute einfach drunter und drüber ging und ich eh schon knapp geworden bin.
Trotzdem will ich deine Tipps natürlich haben..!
Also:
- wie bekomme ich es anders hin die Konsole wieder zu löschen außer mit system("cls")..? (hab ich aus dem Netz übrigens) Gemacht hab ich´s damit sich die Ausgabe schöner liest.- genauso bei system("Pause"), welche Alternative habe ich (return 0;..?), und warum geht das nicht überall..?
- dass strMenuepunkt[0] ein char ist habe ich leider erst kapiert als ich mal probiert habe auf einzelne Zeichen in einem String zuzugreifen..da hast du natürlich Recht..!

NIEMALS using namespace std; in Header-Dateien
- das klingt nach Gefahr, also bitte sag mir warum nicht..?
Für alles Strings zu verwenden ist nicht immer sinnvoll...
- da hast du auch Recht, ich war da nur so beschäftigt mit den Klassen und den anderen Problemen dass ich darüber weniger nachgedacht hab. In den Klasen wollte ich zuerst die Variablen strRechnungGestellt und strStatus als bool deklarieren, hab ich dann aber wegen der Werteausgabe dagegen entschieden.
- mit virtuell geht´s wieder in Richtung Zeiger, oder..? Das sagt mir leider noch zu wenig, virtual/pure virtual gar nichts. In den Semesterferien würde ich gern ein Buch durch machen, in Ruhe, hast du da vielleicht eine Empfehlung..?
Dazu bitte ich dich auch noch um deine Meinung: muss ich C können um C++ verstehen zu können..? Ist C noch so präsent oder wird es von C++ abgelöst..?
Mein Studiengang ist Produktionstechnik und logischerweise ist mir noch nicht >ganz< klar wohin ich mich spezialisieren will, da werden sich im Laufe des Studiums mit Sicherheit noch Themen ergeben von denen ich bis jetzt noch nicht mal gehört habe.
Programmieren macht mir Spaß und ich saug es richtig in mich hinein (wenn die Unterlagen was gescheites sind
), also das werde ich auf jeden Fall machen...
Bisher habe ich einige Excel Makros geschrieben, auch größere..durch meine damalige Arbeit war da nur die Zeit für´s oberflächliche, "funktionale" Wissen - das hat mich da schon geärgert, auch deswegen noch mal die Bitte um den Buchtip damit ich´s hier besser machen kann.
- Zum Zimmernummer erstellen: meinst du damit ein Variables Feld nehmen..? (Stringstream ist auch aus dem Netz, nicht aus dem Kurs...) Vorgabe waren 10 Zimmer, deswegen habe ich nicht mehr Zeit investiert..das es geht habe ich im Netz schon mal nebenbei gelesen, aber das war nicht Thema des Kurses.
- Zu OOP: mal im Ernst, die Zimmer in Ober- & Unterklassen aufzuteilen war hier doch der totale Mist, oder..?
Gemacht hab ich´s weil ich dachte es ist ne gute Übung zum Thema Vererbung und zur Verinnerlichung des ganzen Themas, aber hier habe ich doch eine Menge Zeit verplempert die Methoden der ganzen Klassen zu schreiben - bei einer einzigen Klasse Zimmer wäre das doch übersichtlicher und kürzer gewesen..?? Noch dazu bin ich total skeptisch ob ich das nicht sowieso alles zu kompliziert und durcheinander programmiert habe... 
Headerfunktionen: ... Aber mal Zwischenfrage, hat es einen Grund, warum du hier nie Parameternamen mitgiebst?
- wie meinst du das..? So wie ich´s gemacht habe, habe ich´s im Netz recherchiert (Funktionen in andere Dateien auslagern war auch nicht Teil des Kurses, weil im Netz einfach ne Menge steht und ich´s da gelesen habe, im Bezug auf Header allgemein, hat´s mich einfach interessiert...)
-
Die Konsole löschen macht fast nie Sinn, aber naja: Google: site:msdn.microsoft.com FillConsoleOutputCharacter Ist etwas komplizierter als mit system, aber du erzeugst wenigstens nicht immer einen neuen Prozess. Und es läuft nur auf Windows, aber das tut system("cls") auch.
System("pause") geht eig. überall, aber es ist halt hässlich, eben weils einen neuen Prozess erzeugt was im Allgemeinen Permformanceeinbusen bedeutet - für Übungsprogramme ist die Performance zwar vernachlässigbar, aber gewöhn dir diese System-Schei... gar nicht erst an.
using namespace in Headern kann Namenskonflikte hervorrufen. Aber da gabs schon einige Threads im Forum; bemüh mal die Suchfunktion.
Und (pure) virtual hat rein gar nix mit Zeigern zu tun; Stichwort hier ist Vererbung und Überschreibung. Ach ja: Das mit den Basis- und abgeleiteten Klassen (nicht Ober und Unterklassen - brrrr, bei dem Begriff schüttels mich) ist in diesem Kleinen Beispiel zwar nicht zwangsläufig nötig, aber es macht zur Übung trotzdem Sinn.
Und C muss man nicht können um C++ zu verstehen. Bis auf wenige Ausnahmen kann man sogar behaupten, C ist eine Untermenge von C++ - der Name soll ja extra auf die Kompatiblität hinweisen. Im Gegenteil: C ist für C++-Anfänger teilweise sogar hindelich. Das soll bedeuten: In C bist du zu bestimmten Vorgehensweisen gezwungen (z.B. durch die Fehlende OOP-Unterstützung) die man in C++ so nicht mehr machen sollte. Viele, die von C umsteigen benutzen dann weiter diese Vorgehensweis und sehen C++ als "C + cout + cin" an.
Bei den Parameternamen in der Deklaration scheiden sich die Geister, aber ich bin dafür, denn wenn du z.B. eine Bibliothek schreibst die Closed-Source ist, dann ist die Header-Datei das einzige was der Programmierer zur Verfügung hat. Und ein aussagekräftiger Parameter kann dem Programmierer schon helfen um zu sagen wofür der Parameter da ist. Nichts ist nerviger als sich bei sowas durch endlos lange Dokumentationen zu wühlen, weil man z.B. nicht weiß, wofür der String (das Suchkriterium) bei deiner ZimmerStatus-Funktion da ist! Außerdem zeigt Visual Studio auf Basis des Headers die Intellisense- und Parameterinfos an ;).
-
Alles klar. Das werde ich jetzt alles mal ein bisschen sitzen lassen.
Danke noch mal für deine ausführlichen Tipps..!
