繁体   English   中英

通过引用传递*使用const成员函数的this不能编译?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM