[英]Pass By Reference Using *this from const member function doesn't compile?
我遵循一些示例代码,但是从中得到一个错误,我不知道如何正确修复。 通过* this作为参考时出现错误。 以下是相关代码:
//ShadeRec.h
class World;
class ShadeRec
{
public:
World& w;
ShadeRec(World& wr)
}
ShadeRec::ShadeRec(World& wr) : w(wr) {}
//World.h
#include "ShadeRec.h"
#include "Ray.h"
class World
{
public:
World();
ShadeRec hit_bare_bones_objects(const Ray& ray) const;
}
ShadeRec World::hit_bare_bones_objects(const Ray& ray) const
{
ShadeRec sr(*this);
//Do stuff with sr
return sr;
}
错误发生在hit_bare_bones_objects中,我在其中声明ShadeRec sr(* this); 错误是:
1>错误C2664:'ShadeRec :: ShadeRec(const ShadeRec&)':无法将参数1从'const World'转换为'World&'
1>转换失去预选赛
正确的方法是什么?
“这样做的正确方法是什么?”
您要么需要使用const
引用参数定义构造const
ShadeRec(const World& wr);
// ^^^^^
或声明您的
ShadeRec hit_bare_bones_objects(const Ray& ray); // <<< no const
World
类non const
中的成员函数。
正确的方法取决于//Do stuff with sr
操作是否在非const
World
实例上进行操作。
无论如何,声明为const
类函数成员只能访问this
指针const
,而this
指针只能依次反引用为const
引用。
第三种选择是在与另一个类的接口进行交互时使用const_cast<>
。 不一定建议这样做,您应该真正了解自己在做什么。 它具有相似的危险级别,例如使用reinterpret_cast<>
1 :
ShadeRec World::hit_bare_bones_objects(const Ray& ray) const {
ShadeRec sr(*const_cast<World*>(this));
// ^^^^^^^^^^^^^^^^^^^ ^
//Do stuff with sr
return sr;
}
1) 我偶尔会使用const_cast<>
,但是当我被其他API烦恼(我无法更改或打补丁)时,就无法正确获得const
正确性 。 我仍然不想让他们的错误蔓延到我的代码中(只要我确定这样做)。
ShadeRec::ShadeRec
时说:“世界wr
你给我的是不恒定的,没有保证它会保持不变”。 ShadeRec sr(*this);
说的是“这是一个永恒的世界,那就是不能改变”。 那是个冲突。 要解决此问题,请使ShadeRec(World& wr)
(和World& w
)恒定,或者使World::hit_bare_bones_objects
非恒定。
使ShadeRec
构造函数的参数声明为const:
ShadeRec::ShadeRec( const World& wr)
当你定义hit_bare_bones_objects
,它被标记为const
,这意味着该功能是不允许的状态改变this
。 如果您在ShadeRec
的构造函数中通过非const引用传递*this
,则可能允许ShadeRec
违反该const声明。 因此,您通过const引用传递。
您还可以从hit_bare_bones_objects
删除const
,然后可以将ShadeRec
构造函数保持ShadeRec
。
说得通?
在您的方法中:
ShadeRec World::hit_bare_bones_objects(const Ray& ray) const
您已经告诉编译器,您将不会修改World
任何对象。
您将需要传递*this
作为常量引用。
因为在const
方法中传递了*this
,所以出现了此错误。 因此,这里也是const,只能在const上下文中使用。
因此,如果要将此方法保持const,则应进行以下操作:
ShadeRec::ShadeRec(const World& wr) : w(wr) {}
^^^^^
而且还有World& w;
在ShadeRec内部应更改为const World& w;
,这可能不是您想要的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.