Java Umsteigeprobleme
-
Klar darfst du fragen, es gibt keine dummen Fragen, nur dumme Antworten..
Die Antwort ist:
Weil ich wegen meines Studiums (genauergesagt Analysis II und Programmierpraktikum in Java) keine Zeit hatte, mich um mein Spiel zu kümmern und nun ,bewaffnet mit mehreren Büchern, wieder die Arbeit aufnehme.Was mich gleich dazu bringt daß ich da ne Frage habe. Es geht um Objektorientierung und wie das genau aussieht in C++.
Wann benutze ich zur Instanziierung einer Klasse z.b.
Game Spiel5; Spiel5.starten();und wann mus ich sowas hier bringen:
pointerPlayer = NULL; pointerPlayer = new Player; pointerPlayer->schiesseBall();und kann ich auch direkt auf eine Membervariable der Klasse zugreifen (wenn diese public ist) und wie geht das (bitte mit Code!) in beiden Fällen?
Kenne solche Unterschiede bei Instanziierung und Zugriff von Java her nicht

Hat das irgendwas mit dem Umstand zu tun, ob ich den Code in mehrere Dateien aufgeteilt habe?
Mein Lehrbuch schreibt da leider nix explizites zu und die Compiler errors mit denen ich mich rumschlage helfen mir auch nicht so sehr weiter...
-
Mit new instanzierst du dynamische Objekte, diese bleiben solange bestehen, bis du sie mit delete wieder löschst.
Ohne new sondern als Stackobjekt, legst du Objekte an, die nur solange bestehen, bis sie den Scope verlassen.
{ // Scope-Anfang Game spiel15; Game *spiel20 = new Game(); //.. } //Scope-Ende -> spiel15 wird hier autom. gelöscht, spiel20 existiert weiter.
-
Okay, bleibt noch die Frage mit dem Zugriff auf Membervariablen...
Geht das dann völlig analog zu Java mit
spiel5.anzahlSpieler;machen bzw. im zweiten Fall mit
spiel5->anzahlSpieler;?
In meinem Buch wird das immer mit Funktionen gemacht also z.b.
spiel5->getAnzahlSpieler();aber mich würde interessieren, ob das auch ganz direkt ginge
EDIT: Habs selber rausbekommen, danke

-
Noch eine (etwas knifflige?) Sache, im wesentlichen eine Anlehnung an das ganz oben beschriebene Problem:
Ich habe zwei Klassen (in .hpp un .cpp Dateien) hat, meinetwegen ein Spiel und eine Klasse für ein Menü, die erste Klasse ruft die zweite auf (also das Spiel startet ein Menü), soll ihr "this" als Parameter mitgeben, damit das Menu dem Spiel sagen kann, was vom User eingegeben wurde.
//Datei Game.cpp Menu *pointerMenu; pointerMenu = 0; pointerMenu = new Menu(this);//Datei Menu.cpp Menu (Game *pointerGame) //Der Compiler meckert schon, wenn da was anderes als "const" steht //in der Header Datei, danach kommt dann sowas wie ")" expected before "*" :( { pointerGame->galaxySize = 25; //nur was zum testen pointerGame->numplayers = 100; }Kann mir da wer weiterhelfen? Ich hoffe mein Problem ist deutlich geworden...
-
Hi,
GrafToericht schrieb:
...
...//in der Header Datei, danach kommt dann sowas wie ")" expected before "*" :( ......
Das ist die "typische Fehlermeldung", wenn er einen Typen (hier wohl "Game") nicht kennt. Abhilfe: Richtiges Inkludieren.
Da Du den Typen schon bei der Deklaration von Menu brauchst, schlage ich vor://in Datei Menu.hpp #include "Game.h"//in Datei Menu.cpp #include "Menu.h"Mit Letzterem stellst Du gleichzeitig sicher, dass Deklaration (in hpp) und Definition (in cpp) nicht auseinanderlaufen.
Da Du offensichtlich "gegenseitig verweist" (Game -> Menu und Menu->Game), solltest Du unbedingt "include guards" verwenden).Gruß,
Simon2.
-
GrafToericht schrieb:
...
...//Datei Menu.cpp Menu (Game *pointerGame) //Der Compiler meckert schon, wenn da was anderes als "const" steht .......
Magst Du das etwas qualifizierter schildern ?
WO in den jeweiligen Dateien steht das ?
In den Konstruktoren ? (also Game::Game(...) und Menu::Menu(...)) In "const-Funktionen" ?Gruß,
Simon2.
-
Um jetzt mal allzu umständlichen Schilderungen aus dem Weg zu gehen, hier der Code:
//Datei Game.hpp #include "Menu.hpp" class Game { public: Game(); int galaxySize; int numPlayers; Menu *pointerMenu; };//Datei Game.cpp #include "Game.hpp" Game::Game() { pointerMenu = 0; pointerMenu = new Menu(this); }//Datei Menu.hpp //#include "Game.hpp" Kann ich nicht machen sonst "include nested too deeply" class Menu { public: Menu(Game *pointerGame); };//Datei Menu.cpp #include "Menu.hpp" Menu :: Menu (Game *pointerGame) { pointerGame->galaxySize = 25; pointerGame->numplayers = 100; }Das Gedankliche Problem was dahintersteht ist, daß das Menü ja auf Eingabe des Users wartet und diese dann an das Spiel weiterreicht, wenn der User bestätigt.
Deswegen muss das Menu ja das Spiel referenzieren können, nachdem es selbst von dem Spiel instanziiert wurde (ich habe das mit "this" als Konstruktorparameter versucht).
Nur kann ich ja die Headerdateien nicht gegenseitig includen, sonst gibts ja ne Endlosschleife...
-
Du mußt die Game.hpp in der Menu.cpp inkludieren, weil du sie da brauchst. In der Menu.hpp muß der Compiler nur wissen, dass eine Klasse Game existiert. Dafür nimmt man eine forward-Deklaration
//Datei Menu.hpp //#include "Game.hpp" Kann ich nicht machen sonst "include nested too deeply" - Richtig // statt dessen class Game; class Menu { public: Menu(Game *pointerGame); };
-
Danke Braunstein, aber nachdem ich das geändert habe bekomme ich immernoch nen Fehler nämlich:
10 C:\Dev-Cpp\PointerProject\Game.hpp ISO C++ forbids declaration of `Menu' with no type
Also hier in Zeile 12 der Game.hpp kennt er Menu nicht..
-
Sollte er aber kennen. Mach mal in der Game.hpp eine forward-Deklaration für die Klasse Menu.
Man sollte sowieso möglichst keine Header in anderen Headern inkludieren.
Warum setzt du eigentlich pointerMenu im Konstruktor vor dem new auf 0? Das ist unnötig.
-
Stand in meinem C++ Buch, aus Sicherheitsgründen.
Mit der Forward-Deklaration bekomme ich folgendes ausgeworfen:
C:\Dev-Cpp\PointerProject\Game.cpp In constructor
Game::Game()': C:\\Dev-Cpp\\PointerProject\\Game.cpp invalid use of undefined typestruct Menu'
C:\Dev-Cpp\PointerProject\Game.hpp forward declaration of `struct Menu'Bin völlig ratlos

-
Ja in der Game.cpp darfst Du dann jedoch Menu.hpp zusätzlich inkludieren

-
*Auf die knie fall*
Vielen Dank mal wieder an alle die geholfen haben. Es hat gerade kompiliert und funzt wie es soll. *megafreu*
Das mit der Vorabdeklaration kannte ich noch gar nicht, und die Sache mit den includes hat es ein wenig in sich, weil man das von Java zumindest in dem Umfang nicht kennt.