MEthode nicht deklariert?



  • Hi aller mit einander,

    Ich habe hier ein Problem und zwar habe ich einen Vektor m_primitives in dem Zeiger auf Objekte vom Typ Inifinite_plane, Sphere, und Triangle gespeichert werden. Diese sind alle 3 von Primitive abgeleitet.

    bool
    Scene::Intersect(Ray& ray)
    {
      bool primitive_hit = false;
      for (int i = 0; i < m_primitives.size(); i++){
          if (m_primitives[i].intersect(ray) == true){
            ray.hit() = m_primitives[i];
            primitive_hit = true;
          }
      }
      if (primitive_hit == true)
        return true;    
    
      return false;
    }
    

    Primitive selber ist folgender maßen definiert

    class Primitive
    {
    public:
      Primitive(Shader* shader = 0);
      virtual ~Primitive();
    
      virtual bool Intersect(Ray &ray) = 0;
      virtual bool Occluded(Ray& ray);
      virtual Vec3f GetNormal(Ray& ray) = 0;
    
      Shader* shader();
    protected:
      Shader* m_shader;
    };
    

    Die Intersect methode ist auch in alle 3 Klassen implementiert, jetzt sagt mir der Compiler intersect not declared. Ich weiß nur nicht warum 😞 Weil Intersect ist ja in Primitive schon mal definiert er müsste ja nur für jedes Objekt die jeweilige Intersect MEthode aufrufen.

    Ich hoffe jemand kann mir helfen, da ich so wirklich nicht dahinter komme warum das nicht geht.
    Danke schonmal im Voraus



  • Pure Virtual Methoden müssen in der abgeleiteten Klasse nochmal deklariert werden, dort nur als virtual



  • Meinst du ungefähr sowaS?

    bool
    InfinitePlane::Intersect(Ray& ray)
    {
      Vec3f diff = m_a - ray.origin();
      float t = diff.dot(m_n) / ray.direction().dot(m_n);
      if (t < 1e-5 || t > ray.t()) 
        return false;
      ray.setT(t);
      return true;
    }
    

    das hab ich ja auch gemacht.

    Die genaue Fehlermeldung lautet

    In member function `virtual bool Scene::Intersect(Ray&)': `intersect' has not been declared

    Ich weiß halt nur nicht warum 😞



  • in zeile 6 in deiner hier gezeigten implementierung von Scene::Intersect rufst du von den einzelnen Primitives die member-funktion intersekt auf. die gibt es nicht, die funktion heißt Intersekt (großes i).



  • okay manchmal sieht man den Wald vor lauter Bäumen nicht. Ich hab das jetzt mal angepasst, und jetzt bekomm ich folgende Fehlermeldung:

    In member function `virtual bool Scene::Intersect(Ray&)': `Intersect' is not a type request for member of non-aggregate type before '(' token

    Was will er mir denn damit sagen? Sorry Ich habs gegoogled aber schien mir nciht so richtig schlüssig



  • Okay habs schon trotzdem danke an alle die sich die Mühe gemacht haben mir zu helfen



  • Hallo,

    Ich muss nochmal stören 😛 gibt es eine Möglichkeit zu überprüfen ob in einer Float NAN steht? Weil an irgendeinem Punkt tritt es im Moment bei mir auf und ich finde den grund nicht so richtig 😉 Danke schonmla im Voraus.



  • Wenn in einer Variable ein NaN steht, sollte eine Überprüfung auf Gleichheit mit sich selbst false zurückliefern.



  • entweder im vorhinein prüfen, ob die rechenoperationen ja wohl keine NaN liefern, auf unportable sachen wie isnan zurückgreifen, oder

    if (value != value)
    

    vergleich einer NaN mit einer anderen ergeben false. falls es aber signaling NaNs sind, wirst du eine floating point exception fliegen sehen.
    (das findet man z.b. mit numeric_limits<float>::has_signaling_NaN heraus)

    dafür hättest du im übrigen einen neuen thread aufmachen sollen.


Log in to reply