Используя * это для инициализации ссылки

Я пытаюсь инициализировать экземпляр моего класса 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Как я могу избавиться от этого сообщения об ошибке?

0

Решение

Вы делаете это в hitObjects функция-член, которая помечена как const, Подумайте об этом так: эта функция-член обещает не изменять *this объект. Тем не менее, он счастливо передает его другому объектуconst ссылка. Что если этот другой объект изменил его? Ой!

Есть два возможных решения, которые зависят от проблемы. Ли ShadeRec конструктор на самом деле изменить переданный World объект?

  1. Если это так, вы должны убедиться, hitObjects не помечен как const, В конце концов, это было бы ложью.

  2. Если нет, то это должно быть принято const World&, Тогда это нормально для hitObjects, который отмечен const, пройти *this к этому.

7

Другие решения

Есть разница между const ссылка и непостоянная.

Компилятор не хочет передавать константный объект методу, который принимает непостоянный (изменяемый) объект. Это нарушило бы соглашения об интерфейсе: возможность изменять постоянный объект.

Эта ситуация может возникнуть из-за постоянного объекта, вызывающего изменяемые функции, или постоянного метода, вызывающего изменяемый метод.

0

Предполагая, что вы можете построить ShadeRec из World без изменения переданного Worldвам нужен конструктор ShadeRec, например:

 ShadeRec(const World& world);
0

Тип 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*

0