使用*this初始化引用

Using *this to initialize a reference

本文关键字:引用 初始化 this 使用      更新时间:2023-10-16

我试图用它的构造函数初始化我的类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,我如何才能摆脱此错误消息?

您正在标记为consthitObjects成员函数中执行此操作。可以这样考虑:该成员函数承诺不修改*this对象。然而,它很高兴地通过非const引用将它传递给不同的对象。如果另一个对象修改了它呢?哦哦!

根据问题有两种可能的解决方案。ShadeRec构造函数实际上修改了传递的World对象吗?

  1. 如果是,你应该确保hitObjects没有被标记为const。毕竟,这是撒谎。

  2. 如果没有,应该通过const World&。然后,标记为consthitObjects可以将*this传递给它。

const引用和非常量之间有区别。

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

这种情况可能发生在常量对象调用可变函数或常量方法调用可变方法时。

假设您可以从World构造ShadeRec而不修改传入的World,您需要一个ShadeRec构造器,如下所示:

 ShadeRec(const World& world);

class Worldconst成员函数中的this指针的类型是const World*,这意味着您不能使用它来初始化非const引用(您不能直接"删除"其constness)。

修改ShadeRec的构造函数的参数类型为const World&:

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

class X的成员函数中this的类型为X*。如果成员函数声明为const,则this的类型为const X*