Fra*_*ris 0 c++ inheritance const
我研究这个问题越多,我似乎就越困惑.这是一个家庭作业问题,涉及增加我们教授给我们的代码.我知道这个问题与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);
};
Run Code Online (Sandbox Code Playgroud)
我添加了最终功能,正常.
因此,在Sphere类中,这样实现:
const Vec3 Sphere::normal(Vec3 p)
{
return (p - d_center).normalize();
}
Run Code Online (Sandbox Code Playgroud)
当我'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
Run Code Online (Sandbox Code Playgroud)
你能帮我理解为什么会这样吗?谢谢你的帮助.
当错误消息引用‘this’ argument方法时,它意味着(指向)您正在调用方法的对象.例如,in shape->normal(v),shape是this参数.
要指定给定方法不修改自己的对象 - 它的this参数 - 您需要附加 const到其声明.所以,改变这个:
virtual const Vec3 normal(Vec3 p);
Run Code Online (Sandbox Code Playgroud)
对此:
virtual const Vec3 normal(Vec3 p) const;
Run Code Online (Sandbox Code Playgroud)
表示调用normal(...)一个const对象是"安全的" .
同样,改变这个:
const Vec3 Sphere::normal(Vec3 p)
Run Code Online (Sandbox Code Playgroud)
对此:
const Vec3 Sphere::normal(Vec3 p) const
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1320 次 |
| 最近记录: |