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 nicht
    

    Das 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
    

  • Administrator

    rohezal schrieb:

    DisplacementShader* slimshady = /*(DisplacementShader*)*/ reinterpret_cast<DisplacementShader*> (m_shader);
    

    Sehr gefährlich, was du hier machst. Nimm einen static_cast , wenn du weisst, dass m_shader auf ein DisplacementShader zeigt und DisplacementShader und alle Basisklassen nur einfache Vererbung verwenden. Ansonsten nimm einen dynamic_cast . Der dynamic_cast ist genau dafür gedacht.

    Zu deinem Problem:
    SmoothTriangle.o: In function SmoothTriangle::displace(float)': SmoothTriangle.cxx:(.text+0x273): **undefined reference toDisplacementShader::fake()'**
    Die Methode fake ist 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^^


Anmelden zum Antworten