Probleme beim polymorhpen Casten
-
Mein Programm ist ein Raytracer aber das ist für dieses Problem irrelevant:
Hi ich eine Klasse SmoothTriangle die einen Pointer auf die Klasse Shader hat.
Shader ist selber nicht instanzierbar sondern nur eine Vaterklasse für andere Shader.Shader <- Watershader <- Oceanshader usw...
nun gibt es einen besonderen Shader (Displacement Shader) der total anders ist als alle anderen. Den muss ich gesondert ansprechen. Die Methode fake macht nichts, soll nur Zeigen das es nicht geht. getMagicNumber() kann jeder Shader.
class SmoothTriangle { protected: Shader* m_shader; //stuff } DisplacementShader* slimshady = /*(DisplacementShader*)*/ reinterpret_cast<DisplacementShader*> (m_shader); std::cout << slimshady->getMagicNumber(); // kann jeder Shader, geht slimshady->fake(); //kann nur der Displacement Shader geht nichtDas gibt den folgenden Fehler zurück. Was kann ich da machen?
SmoothTriangle.o: In function `SmoothTriangle::displace(float)': SmoothTriangle.cxx:(.text+0x273): undefined reference to `DisplacementShader::fake()' collect2: ld gab 1 als Ende-Status zurück make: *** [MicroTrace] Fehler 1
-
rohezal schrieb:
DisplacementShader* slimshady = /*(DisplacementShader*)*/ reinterpret_cast<DisplacementShader*> (m_shader);Sehr gefährlich, was du hier machst. Nimm einen
static_cast, wenn du weisst, dassm_shaderauf einDisplacementShaderzeigt undDisplacementShaderund alle Basisklassen nur einfache Vererbung verwenden. Ansonsten nimm einendynamic_cast. Derdynamic_castist genau dafür gedacht.Zu deinem Problem:
SmoothTriangle.o: In functionSmoothTriangle::displace(float)': SmoothTriangle.cxx:(.text+0x273): **undefined reference toDisplacementShader::fake()'**
Die Methodefakeist nicht implementiert. Sie ist deklariert aber nicht definiert.Grüssli
-
Danke für die Hilfe, ich hab den reinterpred nur reingenommen weil static nicht ging . Die Funktion ist implementiert...
oder mach ich da was falsch?
void DisplacementShader::fake() { int i = 1; } float DisplacementShader::heightMapPoint(float u, float v) { Vec3f color = m_displacmentmap->getUV(u,v); return((color[0] - 0.5f) * 2); }Fuck könnte sein das in der make file vergessen habe zu sagen das Diplacement.cxx compilen soll. Nachschaut...
EDIT: Jo daran lags^^