Я пытаюсь инициализировать экземпляр моего класса ShadeRec
со своим конструктором:
ShadeRec(World& world);
Итак, я перехожу к этому:
ShadeRec sr(*this);
где «это» является экземпляром класса World.
Я получаю следующую ошибку:
World.cpp: In member function ‘ShadeRec World::hitObjects(const Ray&) const’:
World.cpp:52: error: no matching function for call to ‘ShadeRec::ShadeRec(const World&)’
ShadeRec.h:17: note: candidates are: ShadeRec::ShadeRec(const ShadeRec&)
ShadeRec.h:15: note: ShadeRec::ShadeRec(World&)
Предполагая, что проблема только в том, что экземпляр World имеет атрибут const
Как я могу избавиться от этого сообщения об ошибке?
Вы делаете это в hitObjects
функция-член, которая помечена как const
, Подумайте об этом так: эта функция-член обещает не изменять *this
объект. Тем не менее, он счастливо передает его другому объектуconst
ссылка. Что если этот другой объект изменил его? Ой!
Есть два возможных решения, которые зависят от проблемы. Ли ShadeRec
конструктор на самом деле изменить переданный World
объект?
Если это так, вы должны убедиться, hitObjects
не помечен как const
, В конце концов, это было бы ложью.
Если нет, то это должно быть принято const World&
, Тогда это нормально для hitObjects
, который отмечен const
, пройти *this
к этому.
Есть разница между const
ссылка и непостоянная.
Компилятор не хочет передавать константный объект методу, который принимает непостоянный (изменяемый) объект. Это нарушило бы соглашения об интерфейсе: возможность изменять постоянный объект.
Эта ситуация может возникнуть из-за постоянного объекта, вызывающего изменяемые функции, или постоянного метода, вызывающего изменяемый метод.
Предполагая, что вы можете построить ShadeRec
из World
без изменения переданного World
вам нужен конструктор ShadeRec, например:
ShadeRec(const World& world);
Тип this
указатель внутри const
функция-член class World
является const World*
Это означает, что вы не можете использовать его для инициализации неконстантной ссылки (вы не можете просто «удалить» ее константность).
Изменить тип аргумента ShadeRec
конструктор const World&
:
ShadeRec(const World& world);
См. C ++ 03, 9.3.2 §1:
Тип
this
в функции-членаclass X
являетсяX*
, Если функция-член объявленаconst
, типthis
являетсяconst X*