Vererbung macht Probleme
-
Hi!
Ich hab hier ein Problem mit der Vererbung. Es gibt eine Klasse, nRenderJob, die die Methode RenderInstructions() hat. Diese Methode ist public und als virtual deklariert. Dann gibt es die Klasse nObject, diese wurde von nRenderJob abgeleitet und überschreibt RenderInstructions(). Die .h Dateien werden alle in mpdk.h inkludiert, quasi als globaler Header. Aber seht selbst;mpdk.h
#ifndef MPDK_H #define MPDK_H #include <iostream> ... (Gekürzt, da viele Standard Header) #include "nrenderjob.h" #include "nobject.h" ... (Noch weitere, für den Fehler höchstwahrscheinlich irrelevante Header) #endif
nrenderjob.h
#ifndef NRENDERJOB_H #define NRENDERJOB_H #include "mpdk.h" class nRenderJob { private: proteted: public: nRenderJob(); ~nRenderJob(); virtual void RenderInstructions(); }; #endif
nobject.h
#ifndef NOBJECT_H #define NOBJECT_H #include "mpdk.h" class nRenderJob; class nObject : nRenderJob { private: protected: virtual void RenderInstructions(); public: nObject(); ~nObject(); }; #endif
Der Compiler (gcc 3.4.1) sagt:
nobject.h:27: Fehler: invalid use of undefined type 'struct nRenderJob' (das ist die class nObject : nRenderJob Zeile)
nobject.h:20: Fehler: forward declaration of 'struct nRenderJob' (das ist die class nRenderJob; Zeile)Bin über jede Hilfe dankbar.
Mfg,
Alex
-
class nRenderJob;
du kannst von keiner klasse erben die nicht vollständig bekannt ist
achja, ein weietres problem könnte sein, dass du versuchst eine klasse mit einer forwarddeklaration zu versehen die schon komplett existiert(und included ist), das gibt noch einen weiteren dicken fehler.am besten du lernst wann man die forwarddeklarationen benutzt und wann die includes
-
nobject.h
#ifndef NOBJECT_H #define NOBJECT_H #include "mpdk.h" #include "nrenderjob.h" // Der Header muss hier wohl auch rein... //class nRenderJob; class nObject : nRenderJob { private: protected: virtual void RenderInstructions(); public: nObject(); ~nObject(); };
Ich würde erstmal sagen, dass das zweite Deklarieren der Class n Problem ist
-
So hab ich es vorher auch gemacht, nur da kam der Fehler:
nobject.h:27: Fehler: expected class-name vor "{"
-
mach mal die vererbung public:
class nObject : public nRenderJob {
und mache keinen header mit includes, sondern includiere immer dort, wo du etwas brauchst, genau das, was du benötigst.
virtuel braucht public vererbung.
und dann klamüser alles nochmal genau aus und denke an die forward deklarationen, so du sie brauchst.
-
public hab ich vergessen zu schreiben, aber gleicher Fehler.
Dann werd ich mal alles umschreiben (die Header).
-
Ok, jetzt hab ich überall nur die benötigten Header eingetragen.
Jetzt folgendes:nrenderjob.cpp:13: undefined reference to 'vtable for nRenderJob' (in der Zeile vom Konstruktor)
nrenderjob.cpp:17: undefined reference to 'vtable for nRenderJob' (in der Zeile vom Destruktor)
nobject.cpp:14: undefined reference to 'typeinfo for nRenderJob' (in der Zeile vom Konstruktor)Im ganzen Projekt gibt es jetzt keine Forwarddeklarationen mehr, nur eingebundene Header.
-
Müsste die virtuelle Funktion in der Basisklasse nicht auch
gleich Null gesetzt werden?!virtual void RenderInstructions() = 0;
-
Wow, das wars.
Das man virtual Funktionen 0 setzen muss hab ich aber bisher in keinem Tutorial gefunden, auch nicht in meinem Buch. Danke, an Alle!
-
Denk aber daran, dass du durch das "0-Setzten" eine abstrakte Klasse hast. Dadurch kannst du keine Instanz dieser Klasse erzeugen und MUSST von ihr erben.
-
Das ist in dem Fall kein Problem, da man mit der nRenderJob Klasse allein nichts machen kann (sie beeinhaltet nur ctor, dtor und die eine Methode).
Aber für andere Projekte wäre es interessant, wie man es lösen könnte, ohne das 0-setzen.
Mfg,
Alex
-
wenn man aber nur eine polymorphe klasse hat, also nur mit einer virtual methode, dann kann man doch trotzdem von der klasse ein objekt erstellen, oder?
-
Gast996611 schrieb:
Das ist in dem Fall kein Problem, da man mit der nRenderJob Klasse allein nichts machen kann (sie beeinhaltet nur ctor, dtor und die eine Methode).
Aber für andere Projekte wäre es interessant, wie man es lösen könnte, ohne das 0-setzen.
Mfg,
AlexEs sollte normal auch ohne abstrakte Basisklasse gehen.
Hast du vielleicht keine Default-Implemention der virtuellen Methode der Basisklasse definiert?
-
leech schrieb:
wenn man aber nur eine polymorphe klasse hat, also nur mit einer virtual methode, dann kann man doch trotzdem von der klasse ein objekt erstellen, oder?
Ja
-
Nein, eine Defaultimplemenatation hab ich nicht.
Btw. eine Frage hätt ich noch kurz: Wie komm ich von einem Bereich von 0 - 255 auf einen Bereich von 0.0 bis 1.0? (RGB in OpenGL Farben umrechnen)
-
Gast996611 schrieb:
Nein, eine Defaultimplemenatation hab ich nicht.
Dann definiere mal eine. Es reicht auch bloß
{}
.
Jedoch wäre dann, wie du schon gemacht hast, eine abstrakte Klasse besser.zur 2.Frage: http://www.c-plusplus.net/forum/viewtopic.php?t=56693&highlight=opengl+rgb
-
Danke!
-
Gast996611 schrieb:
Nein, eine Defaultimplemenatation hab ich nicht.
Btw. eine Frage hätt ich noch kurz: Wie komm ich von einem Bereich von 0 - 255 auf einen Bereich von 0.0 bis 1.0? (RGB in OpenGL Farben umrechnen)
1.0/255*farbwert