C/C++ Übung mit Klassen

12/04/2013 09:57 theo1990#16
Ja klar jetzt gehts zwar wenn ich die implementierung in main.cpp einfüge. :mofo:

Jedoch ist das nicht Sinn der Sache! Ich hoffe du kannst jetzt was mit anfangen.

p.s: Das Programm läuft jetzt. Bin fertig. Jedcoh habe ich immer noch Probleme mit dem Linker..

[Only registered and activated users can see links. Click Here To Register...]
12/04/2013 13:26 Delinquenz#17
In der Login.cpp definierst du void Login::SetName(char* NewName[]) statt void Login::SetName(char NewName[]).

Da du in C++ Methoden überladen kannst, was heißt, dass Funktionen mit gleichen Namen und unterschiedlichen Parametern existieren können, deklarierst du eine Funktion namens SetName mit dem Parameter NewName vom Typ char[] und definierst eine Funktion namens SetName mit dem Parameter NewName vom Typ char*[] was ein Pointer eines Char-Arrays wäre statt einem Char-Array.

Was dein komisches C/C++ Gemisch sein soll und wieso du C-Header wie stdio.h inkludierst, gehört hier zwar nicht hin, aber dennoch ist das nicht unbedingt die beste Praxis.
12/04/2013 16:56 theo1990#18
Quote:
Originally Posted by Delinquenz View Post
In der Login.cpp definierst du void Login::SetName(char* NewName[]) statt void Login::SetName(char NewName[]).

Da du in C++ Methoden überladen kannst, was heißt, dass Funktionen mit gleichen Namen und unterschiedlichen Parametern existieren können, deklarierst du eine Funktion namens SetName mit dem Parameter NewName vom Typ char[] und definierst eine Funktion namens SetName mit dem Parameter NewName vom Typ char*[] was ein Pointer eines Char-Arrays wäre statt einem Char-Array.

Was dein komisches C/C++ Gemisch sein soll und wieso du C-Header wie stdio.h inkludierst, gehört hier zwar nicht hin, aber dennoch ist das nicht unbedingt die beste Praxis.
Die Fehler die du mir geschrieben hast sind korrekt, jedoch waren Sie für mich nicht relevant, da die login.cpp die ganze zeit nicht mit compiliert wurde demnach hatte ich dort keien Fehlermeldung erhalten. Ich musste nur in c::b diese dateien (login.h, login.cpp) 2 optionen hinzufügen. Siehe da sie wurden compiliert und mein Fehler war wie weggewischt. War also ein reines c::b problem.

Nun zu meinem unsauberen Code. Da ich eine AUsbildung zum Anwendungsentwickler mache und auf meiner Arbeit rein mit Web development zutun habe, bekomme ich in der Schule 1. veraltetes und 2. unschönes C bzw. C++ beigebracht. Es ist eher ein Mix aus beidem, wie man unschwer erkennen kann. Wir besitzen 3 Lehrer und jeder hat eine andere mentalität was das lernen mit Programmiersprachen betrifft. Egal...jedenfalls danke für eure Hilfe.
12/05/2013 12:24 Nightblizard#19
Ein paar allgemeine Dinge zu deinem Code:

Warum benutzt du hier new? Bei deinem Anwendungsfall hat das Objekt nichts auf dem Heap verloren. Das hat gleich mehrere Gründe. Zum einen hast du ein Speicherleck, da du den Speicher nicht wieder mit delete frei gibst und zum anderen ist das hier ganz einfach unnötig. Leg das Objekt auf den Stack, dann musst du dich gar nicht mehr um den Speicher kümmern.

Benutze keine char-arrays, wenn du strings willst. Dafür gibt es die Klasse std::string im Header <string>. Sobald der Benutzer nämlich mehr als die vorhergesehenen 20 Zeichen eingibt, kommt es zu einem buffer overflow. Bei einem std::string passiert das nicht und er bringt noch gleich einen Haufen anderer Vorteile mit sich.

Das bringt uns dann zum nächsten Punkt, die Benutzereingaben. Die fängt man nicht mit scanf ab. Das ist nicht nur sehr unflexibel, sondern auch noch sehr unsicher (Overflow z.B.). Wenn du es richtig machen möchtest, dann benutze std::cin.

In der GetName Methode erzeugst du undefined behavior. Du legst einen char auf den Stack und gibst dann einen Pointer auf diesen char zurück. Nachdem die Methode jedoch verlassen wird, wird der Stack bereinigt und dein Pointer kann nun auf alles mögliche zeigen.


Mehr fällt mir auf die Schnelle nicht auf, aber das sollte schonmal ausreichen fürs erste.
12/05/2013 12:57 Tasiro#20
Quote:
Originally Posted by Nightblizard View Post
In der GetName Methode erzeugst du undefined behavior. Du legst einen char auf den Stack und gibst dann einen Pointer auf diesen char zurück. Nachdem die Methode jedoch verlassen wird, wird der Stack bereinigt und dein Pointer kann nun auf alles mögliche zeigen.
Um genau zu sein, ist erst die Verwendung des Rückgabewertes undefiniertes Verhalten, weshalb nur in der ersten Version des Quelltextes undefiniertes Verhalten auftritt. Das muss natürlich dennoch geändert werden.