OOP Problem
-
Hi
ich progge zurzeit an einem kleinen spiel, das problem hat aber nur mit vererbung zutun^^.
ich habe eine object klasse:
#include "DDraw.h" class Object { protected: int Koordinaten[2]; int Hight; int Width; LPDIRECTDRAWSURFACE7 lpddsBitmap; RECT rectbitmap; DDraw DDraw_I; public: void set_Koordinaten(int, int); void Draw_Object(); void LoadBitmap(char*); void Set_Width_Hight(int, int); };die hat eien funktion loadbitmap:
void Object::LoadBitmap(char* path)//LoadBitmap(char path, RECT BitmapRect) { lpddsBitmap = DDLoadBitmap(lpDirectDraw, path, Width, Hight); }so. wenn cih dann die funktion aufrufe geht alles super und funztz.
jetz vererbt object aber seien member und methoden an die klasse player:
class Player : public Object { private: int Hitpoints; public: void Move(char*); };;
wennn jetzt für eine instanz der klasse player die funktion loadbitmap aufrufe, stürzt mein prog mit fehlerberichterstattungsassitenten ab. habt ihr da ne idee?
MfG
Eldarion
-
Abgesehen davon, daß der Klasse Object der virtuelle Destruktor fehlt, und daß char * nun wirklich ein ganz und gar ungeeigneter Typ zum Umgang mit Strings ist, sehe ich erst mal keinen Fehler. Vermutlich liegt das Problem irgendwo anders (mehr Code zeigen könnte helfen).
-
ich dchte, wenn ich keinen destruktor festlege, baut den der compiler automatisch oder? :???:
was würdet ihr denn empfhelen um mit strings umzugehen?
die klasse string aus der <string.h> ?
naja, dann hier nochmal mehr code:
//Hauptklasse #include "DDraw.h" #include "Player.h" class Game { private: DDraw Game_DDraw; //KI Game_KI; //Input Game_Input; Player MainPlayer; Object Test; public: bool Init_All(); void Release_All(); void Render(); void Clear_Scren(); void Blit_Bitmap(RECT, LPDIRECTDRAWSURFACE7); DDraw getDirectDrawInstance (); void Move_Player(char*); };das ist meine main klasse.
wenn ich jetz in Init_All()
folgendes mache:
bool Game::Init_All() { if(Game_DDraw.ddInit(hwnd)==FALSE) { MessageBox(NULL, "Fehler beim Initalsieren von DDraw", "", MB_OK); return false; } MainPlayer.Set_Width_Hight(40, 30); MainPlayer.set_Koordinaten(300, 400); MainPlayer.LoadBitmap("Player.bmp"); return true;dann stürzt das programm wie gesagt ab.
wenn ich aber:
bool Game::Init_All() { if(Game_DDraw.ddInit(hwnd)==FALSE) { MessageBox(NULL, "Fehler beim Initalsieren von DDraw", "", MB_OK); return false; } Test.Set_Width_Hight(40, 30); Test.set_Koordinaten(300, 400); Test.LoadBitmap("Player.bmp"); return true; }mache, dann läuft alles und das bitmap wird geladen. also wen cih die parent klasse benutez funztes bei der child net.
schonma danke im vorraus
mfg
eldarion
-
In <string.h> gibt es keine Klassen. Das ist ein veralterter C Header. Was du meinst, ist wohlmöglich die Klasse std::string aus <string> und ja, die ist geeignet.
Wenn du selbst keinen Destruktor schreibst, wird einer angelegt. Der ist aber nicht virtuell. Und wenn du von einer Klasse (public) ableitest, brauchst du in der Regel einen virtuellen Destruktor.
-
k, dann nehm ich std::string^^.
ich komm mit den beiden headern immer durcheinandern^^.
ok, ich check ma das mit dem virtuellen destruktor.
edit: hat tatsöchlich daran gelegen, das der destruktor net virtuel war. danke,ihr seid super

edit2: öhm, das mit char* muss schon manchmal sein, weil viele directx sachen erwarten char* und net string. sonst müsste man wieder konvertiern
-
Eldarion schrieb:
...das mit char* muss schon manchmal sein, weil viele directx sachen erwarten char* und net string. sonst müsste man wieder konvertiern
Stimmt schon; manchmal muß es sein.
Aber oftmals lohnt sich die string-Verwendung (mit gelegentlichen Transformationen - die sind aber selten wirklich ein Performanceproblem) dennoch, weil man dadurch unheimlich an Übersichtlichkeit gewinnt bei allem, was wirklich stringbehandlung ist.Kleine Frage: kennst Du string::c_str() ?
Damit kann man immer kurz vor einem APIaufruf einen entsprechenden (char const*) bekommen...Gruß,
Simon2.