0

我正在尝试ShadeRec使用其构造函数初始化我的类的实例:

ShadeRec(World& world);

所以我传递给它:

ShadeRec sr(*this);

其中“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,我该如何摆脱此错误消息?

4

4 回答 4

7

您在hitObjects标记为的成员函数中执行此操作const。可以这样想:该成员函数承诺不修改*this对象。但是,它很高兴通过非const引用将其传递给不同的对象。如果其他对象修改了它怎么办?哦哦!

有两种可能的解决方案取决于问题。构造函数是否ShadeRec真的修改了传递的World对象?

  1. 如果是这样,您应该确保hitObjects没有标记为const. 毕竟,那是在撒谎。

  2. 如果没有,它应该采取它const World&。那么hitObjects标记const为 的 传递*this给它就可以了。

于 2013-03-25T20:31:59.697 回答
0

const参考和非常量 之间存在差异。

编译器不想将常量对象传递给采用非常量(可变)对象的方法。这将违反接口协议:能够修改常量对象。

这种情况可能是由常量对象调用可变函数或常量方法调用可变方法引起的。

于 2013-03-25T20:32:34.227 回答
0

a 的成员函数中的this指针类型is ,这意味着您不能使用它来初始化非常量引用(您不能只是“删除”它的constness)。constclass Worldconst World*

ShadeRec将的构造函数的参数类型更改为const World&

ShadeRec(const World& world);
参见 C++03, 9.3.2 §1:

thisa 的成员函数中的类型class XX*。如果声明了成员函数const,则类型thisconst X*

于 2013-03-25T20:32:41.617 回答
0

假设您可以ShadeRec从 a构造 aWorld而无需修改传入的World,则需要这样的 ShadeRec 构造函数:

 ShadeRec(const World& world);
于 2013-03-25T20:39:45.263 回答