Wieso ist dies eine abstrakte Klasse?
-
Hi,
Ich habe folgendes Problem: Beim erstellen meines Projekts kommt an einer Stelle, dass er die Klasse CDEDeviceWin32 nicht instanzieren kann, da diese eine Abstrakte Klasse ist. Doch ich sehe kein Merkmal, dass die Klasse wirklich abstrakt ist.
Hier meine Klasse:
class CDEDeviceWin32 : public CDEDeviceStub { public: CDEDeviceWin32(const core::dimension2d<s32>& windowSize, u32 bits, bool fullscreen, bool stencilbuffer, bool vsync, const wchar_t* version); virtual ~CDEDeviceWin32(); virtual bool run() = 0; virtual void setWindowCaption(const wchar_t* text) = 0; virtual bool isWindowsActive() = 0; virtual void closeDevice() = 0; void OnResized(); virtual void setResizeAble(bool resize=false); private: bool switchToFullScreen(s32 width, s32 height, s32 bits); void resizeIfNecessary(); HWND HWnd; bool ChangedToFullScreen; bool FullScreen; bool IsNonNTWindows; bool Resized; };
Hier bringt er die Fehlermeldung:
CDEDeviceWin32* dev = new CDEDeviceWin32(windowSize, bits, fullscreen, stencilbuffer, vsync, version);
Wieso, enn überhaupt, ist die Klasse abstrakt? Wie kann ich den Fehler beheben?
MfG
Gfxer
-
Hallo,
Ich sehe hier 4 rein virtuelle Funktionen (= 0). Natürlich ist die Klasse dann abstrakt. Du brauchst für diese Funktionen halt auch Definitionen.
-
virtual = 0 heißt das es abstract ist. Sinn und Zweck des ganzen: derjenige der die Klasse designed und implementiert hat, will, das du die pure virtual Methoden selbst implementierst, da er nicht weiß was da genau rein soll. Das hat nichts damit zutun, das derjenige "doof" ist, sondern das es mit zum OO-Konzept gehört.
Du kannst auch leere Methoden implementieren. Aber letztendlich mußt du eine eigene Klasse definieren und von CDEDeviceWin32 ableiten, und dann kannst du deine eigene instanzieren.
-
Hmm, diese Funktionen sind eben schon in CDEDeviceStub als virtual definiert und CDEDeviceWin32 ist abgeleitet von der. Zudem habe ich ein bestehendes Projekt, wo das genau auch so implementiert ist, als Vorlage. Dort funktioniert alles einwandfrei.
-
Habe gerade gemerkt, dass in dem anderen Projet nur virtual und nicht virtual ... = 0 steht. Habe das = 0 nun entfernt, aber es kommt immer noch der gleiche Fehler, auch wenn ich sogar das virtual entferne.
-
Ach mist, ein =0 habe ich übersehen, nun funktioniert alles.
-
Ohohoh,
Wenn es eine bestehende Klasse ist, dann wird sich irgendwer was dabei gedacht haben das virtuell zu machen -> also, leite Deine Klasse lieber davon ab (auch, wenn ich Dein Projekt und das Klassengerüst nicht kenne).