0

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このエラーメッセージを取り除くにはどうすればよいですか?

4

4 に答える 4

7

これは、hitObjectsとしてマークされているメンバー関数で実行していconstます。このように考えてください。そのメンバー関数は、*thisオブジェクトを変更しないことを約束しています。ただし、const参照なしで別のオブジェクトに喜んで渡します。他のオブジェクトがそれを変更した場合はどうなりますか?ええとああ!

問題に応じて2つの可能な解決策があります。ShadeRecコンストラクターは実際に渡されたWorldオブジェクトを変更しますか?

  1. hitObjects含まれている場合は、としてマークされていないことを確認する必要がありますconst。結局のところ、それは嘘になります。

  2. そうでない場合は、それを取る必要がありconst World&ます。次にhitObjects、マークされているconst、が渡さ*thisれても問題ありません。

于 2013-03-25T20:31:59.697 に答える
0

const参照と非定数に は違いがあります。

コンパイラーは、非定数(可変)オブジェクトを受け取るメソッドに定数オブジェクトを渡したくありません。これは、インターフェイスの合意に違反します。つまり、定数オブジェクトを変更できるということです。

この状況は、可変関数を呼び出す定数オブジェクトまたは可変メソッドを呼び出す定数メソッドから発生する可能性があります。

于 2013-03-25T20:32:34.227 に答える
0

aのメンバー関数this内のポインターのタイプはです。これは、非const参照を初期化するためにそれを使用できないことを意味します(constnessを単に「ドロップ」することはできません)。constclass Worldconst World*

ShadeRecのコンストラクタの引数の型を次のように変更しますconst World&

ShadeRec(const World& world);
C ++ 03、9.3.2§1を参照してください。

thisaのメンバー関数ののタイプclass XはですX*。メンバー関数が宣言されている場合const、のタイプthisconst X*

于 2013-03-25T20:32:41.617 に答える
0

渡されたものを変更せずにShadeRecからを構築できると仮定すると、次のようなShadeRecコンストラクターが必要です。WorldWorld

 ShadeRec(const World& world);
于 2013-03-25T20:39:45.263 に答える