Problem/Frage 1:
Du deklarierst eine Variable name mit einer festen Länge und behauptest dabei, dass sich diese Länge nicht mehr ändert. (char name[31])
Bei der Instanziierung deiner Klasse (ship1 = new CRaumschiff(500, 500)
![;)](wcf/images/smilies/wink.png.pagespeed.ce.L9LRa_F2a5.png)
wird diese Variable automatisch definiert und der Speicherplatz (Array), also 31 char's reserviert. Bei dieser Reservierung bleibt der Inhalt dieses Speicherbereiches unangetastet - somit stehen unnütze Bytes darin und bei der Ausgabe kommt es zu "Hyroglyphen". Der Ausdruck ship1->name bezeichnet somit einen Zeiger auf das erste Element dieses nicht initialisierten Speicherplatzes.
Nun versuchst du genau dieser Zeigervariable einen anderen Wert zu zuweisen.
|
C-/C++-Quelltext
|
1
|
std::cin.get(ship1->name, 30);
|
Diese Funktion sucht das Ende der Zeichenkette (ein Byte mit dem Wert 0) und hängt die eigentliche Eingabe des Nutzers dort einfach dran. Du hast jedoch eine maximale Anzahl an Zeichen in deiner Zeichenkette bestimmt: 30. Da vermutlich innerhalb dieser 30 Zeichen in deinem bereits vorhandenen Speicherbereich scheinbar keine 0 zu finden ist, macht die Funktion im Grunde genommen garnichts - sonst würde es zum Overflow, bzw. Memory Access Violation kommen.
Was du jetzt machen kannst, um das zu beheben ist, deinen Speicherbereich vor dem get()-Aufruf komplett zu nullen. (memset() bzw. ZeroMemory())
Problem / Frage 2:
ship1->name = "Maya\0";
Das funktioniert nicht, da du deiner Variable einfach einen anderen Zeigerwert übergeben möchtest - undzwar einen Zeiger auf einen konstanten Speicherbereich - dazu noch von anderer Länge, als du bei der Deklaration erst behauptet hast. Somit entsteht ein Typemismatch und der Compiler wirft einen Fehler.
Siehe dazu auch BlueCobolds Kommentar.
Ich hoffe, dir sind nun die Grundlagen etwas vertrauter