使用*this初始化引用
Using *this to initialize a reference
我试图用它的构造函数初始化我的类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
,我如何才能摆脱此错误消息?
您正在标记为const
的hitObjects
成员函数中执行此操作。可以这样考虑:该成员函数承诺不修改*this
对象。然而,它很高兴地通过非const
引用将它传递给不同的对象。如果另一个对象修改了它呢?哦哦!
根据问题有两种可能的解决方案。ShadeRec
构造函数实际上修改了传递的World
对象吗?
-
如果是,你应该确保
hitObjects
没有被标记为const
。毕竟,这是撒谎。 -
如果没有,应该通过
const World&
。然后,标记为const
的hitObjects
可以将*this
传递给它。
const
引用和非常量之间有区别。
编译器不希望将常量对象传递给接受非常量(可变)对象的方法。这将违反接口协议:能够修改一个常量对象。
这种情况可能发生在常量对象调用可变函数或常量方法调用可变方法时。
假设您可以从World
构造ShadeRec
而不修改传入的World
,您需要一个ShadeRec构造器,如下所示:
ShadeRec(const World& world);
class World
的const
成员函数中的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*
相关文章:
- C++-模板嵌套类的引用初始化无效
- 在引用初始化中使用已删除的复制构造函数进行复制初始化
- 模板流运算符重载错误:引用初始化无效,与basic_istream和basic_ifstream之间的差异有关
- 具有字符串文本构造函数的类不适用于 const 引用初始化
- 类型为"短整型 (&)"的引用初始化无效
- 引用初始化和常量表达式
- 在Visual Studio 2013中为rvalue引用初始化捕获
- 从大括号括起来的初始值设定项列表进行的Lvalue引用初始化无法编译
- Visual C++ 2015 中右值的非常量引用初始化无效
- 是否可以使用对派生类实例的基类引用初始化派生类引用
- 类型'int&'的引用初始化无效,传递参数 1 时出错
- 引用初始化表单
- 从类型为"int*"的临时引用初始化类型为"int&"的非常量引用无效
- 简单的C++日志记录类-ostream引用初始化
- 错误:类型为"cv::Mat&"的非常量引用初始化无效
- 为什么我收到类型为"const vec&"的引用初始化无效
- 从类型为"char*"的临时引用初始化类型为"char*&"的非常量引用
- 为什么这会发送一个关于引用初始化无效的错误
- 为什么此处不对引用初始化执行复制初始化?
- std::vector不会为多个向量条目创建cv::Mat的新引用——初始化矩阵时,数据会被覆盖