Ошибка «Discards qualifiers» с виртуальной функцией и / или const в c ++ - PullRequest
0 голосов
/ 04 декабря 2011

Чем больше я исследую эту проблему, тем больше я запутываюсь. Это домашнее задание, которое включает в себя расширение кода, данного нам нашим профессором. Я знаю, что проблема связана с ключевым словом 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();
}

Когда я `делаю ', я получаю следующую ошибку:

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

Можете ли вы помочь мне понять, почему это происходит? Спасибо за вашу помощь.

Ответы [ 2 ]

5 голосов
/ 04 декабря 2011

Когда сообщение об ошибке ссылается на ‘this’ argument метода, это означает (указатель на) объект, для которого вы вызываете метод. Например, в shape->normal(v), shape является аргументом this.

Чтобы указать, что данный метод не изменяет свой собственный объект & mdash; его this аргумент & mdash; вам нужно добавить const к его объявлению. Итак, измените это:

virtual const Vec3 normal(Vec3 p);

к этому:

virtual const Vec3 normal(Vec3 p) const;

для обозначения того, что "1017" для объекта const "безопасно".

Аналогично, измените это:

const Vec3 Sphere::normal(Vec3 p)

на это:

const Vec3 Sphere::normal(Vec3 p) const
1 голос
/ 04 декабря 2011

Как говорит компилятор, попытка вызова неконстантной функции из константной функции приведет к потере константности самого объекта.

Вам также придется сделать функцию normal константной.или не называйте это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...