我研究这个问题越多,我似乎就越困惑。这是一个家庭作业问题,涉及增加我们教授给我们的代码。我知道这个问题与const关键字有关,还有一些令人困惑的新应用程序。
有一个泛型类Object,从中继承了几个子类(Sphere,Cone,Polygon)。以下是Object中的类:
public: // computational members
// return t for closest intersection with ray
virtual float intersect(const Ray &ray) const = 0;
// return color for intersection at t along ray r
virtual const Vec3 appearance(const World &w,
const Ray &r, float t) const = 0;
//The following function is added by me
virtual const Vec3 normal(Vec3 p);
};
我添加了最终功能,正常。
因此,例如,在Sphere类中,这是实现的:
const Vec3 Sphere::normal(Vec3 p)
{
return (p - d_center).normalize();
}
当我'make'时,我收到以下错误:
Appearance.cpp: In member function ‘const Vec3 Appearance::eval(const World&, const Vec3&, const Vec3&, Vec3, int) const’:
Appearance.cpp:46: error: passing ‘const Object’ as ‘this’ argument of ‘virtual const Vec3 Object::normal(Vec3)’ discards qualifiers
make: *** [Appearance.o] Error 1
你能帮我理解为什么会这样吗?谢谢你的帮助。
答案 0 :(得分:5)
当错误消息引用方法的‘this’ argument
时,它意味着(指向)您正在调用方法的对象。例如,在shape->normal(v)
中,shape
是this
参数。
要指定给定方法不修改自己的对象 - 其this
参数 - 您需要将 const
附加到其声明中。所以,改变这个:
virtual const Vec3 normal(Vec3 p);
到此:
virtual const Vec3 normal(Vec3 p) const;
表示在normal(...)
对象上调用const
是“安全的”。
同样,改变这个:
const Vec3 Sphere::normal(Vec3 p)
到此:
const Vec3 Sphere::normal(Vec3 p) const
答案 1 :(得分:1)
与编译器一样,尝试从const函数调用非const函数会失去对象本身的常量。
你也必须使normal
函数const,或者避免调用它。