2013-03-25 115 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);