2013-03-25 58 views
0

我试图用它的构造函数初始化我ShadeRec类的实例的引用:使用*这个初始化

ShadeRec(World& world); 

所以我给它:

ShadeRec sr(*this); 

其中“这个”是世界类的一个实例。

我得到以下错误:

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&) 

假设的问题就是,世界实例具有属性const,我怎么能摆脱此错误消息的?

+1

是否构造需要一个非const引用?如果没有,为什么不让它参考一个const参数? – us2012 2013-03-25 20:30:39

+0

与http://stackoverflow.com/questions/2912445/how-to-discard-const-in-c/2912726#2912726非常相似。另请参阅@ http://stackoverflow.com/questions/5598703/c-const-usage-explanation关于const如何工作的指针。 – user2184879 2013-03-25 20:57:18

回答

7

您在hitObjects成员函数中执行此操作,该成员函数标记为const。这样想一想:该成员函数承诺不会修改*this对象。但是,它很高兴地通过非const参考将它传递给另一个对象。如果其他对象修改了它呢?呃哦!

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

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

  2. 如果不是,它应该采取const World&。然后,标记为consthitObjects可以将*this传递给它。

+0

它不修改传递的对象,ShadeRec使用它来初始化ShadeRec实例的World对象。但是当我将参数更改为const World时,我得到另一个错误。 ShadeRec.cpp:在构造函数'ShadeRec :: ShadeRec(const World&)'中: ShadeRec.cpp:7:错误:从'const World'类型的表达式'World&'引用无效初始化 – 2013-03-25 22:02:02

+0

现在我得到这样的:对于架构x86_64的未定义的符号: “三维点::三维点(三维点常量&)”,从引用:ShadeRec :: ShadeRec(ShadeRec常量&)在cclHIDes.o 在cclHIDes.o ShadeRec :: ShadeRec(ShadeRec常量&) Ray :: Ray(Ray const&)in cclHIDes.o ld:找不到架构x86_64的符号 collect2:ld返回1退出状态 – 2013-03-25 23:27:19

+0

@ RupertCobbe-Warburton我将首先回复您的第一条评论。你有一个更有趣的问题。您将'* this'作为'const'传递给新的'ShadeRec'对象,该对象保持对象的非'const'引用。这根本行不通。为什么'ShadeRec'没有保留'const'引用?或者'hitObjects'不应该是'const'成员函数。 – 2013-03-25 23:31:30

0

const引用和一个非常量之间是有区别的。

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

这种情况可能来自于常量对象调用可变函数或调用可变方法的常量方法。

+0

使用const引用传递的对象不是一个常量对象。 const引用中的“const”这个词没有提供任何关于对象的信息,它只是表示引用的属性。 – 6502 2013-03-25 20:35:19

0

键入class Worldconst成员函数内this指针的是const World*,这意味着不能使用它来初始化一个非const参考(也可以不只是“滴”其常量性)。

变化ShadeRec的构造的自变量的对const World&类型:

ShadeRec(const World& world); 
见C++ 03,9.3。2§1:

The type of this in a member function of a class X is X* . If the member function is declared const , the type of this is const X*

+0

它不修改传递的对象,ShadeRec使用它来初始化ShadeRec实例的World对象。但是当我将参数更改为const World时,我得到另一个错误。 ShadeRec.cpp:在构造函数'ShadeRec :: ShadeRec(const World&)'中:ShadeRec.cpp:7:错误:类型'World&'的引用从'const World'类型的表达式无效初始化 – 2013-03-25 23:07:27

0

假设你可以构建从World一个ShadeRec无需修改传入World,你需要一个ShadeRec构造是这样的:

ShadeRec(const World& world);