Const Discards Qualifers:C ++

私はOpenGLを使用してカメラの視点をレンダリングしています。私のコードでは、ライトの方向(ここではタイプ "Vector4"と表示されています)を取ろうとしていて、そのタイプを "Matrix4x4" Modelviewの変換(申し訳ありませんが、これは意味がない場合、これは学校のプロジェクトのため、私はまだこのことについて学んでいるように)とにかく、私のコードは次のように行く...

Vector4 lightDirection = data->dir * follow->getModelviewMatrix().getInverse().getTranspose();
data->dir = lightDirection;
setLight(*data);

これは私に次のエラーを与える:

passing 'const vec4' as 'this' argument of 'vec4& vec4::operator=(const vec4&)[with T = double]' discards qualifiers

このコードの多くは、クラス(つまりベクトルと行列の型)のためにあらかじめ書き込まれていますが、誰かがエラーの意味を解読するのに役立ちます。私は必要に応じてより多くの情報を提供することができます。

I figured 'data' or 'data->dir' were const, however I can find no mention of either of them to be. 'dir' is of type SceneLightData, そしてwhen its added on I'm doing this:

void Scene::addLight(const SceneLightData &sceneLight)
{
    SceneLightData light = sceneLight;

    m_lights.push_back(&light);
}

エラーは次の行で発生します。

data->dir = lightDirection;

編集

問題が解決しました。みんな、ありがとう!溶液:

void Scene::addLight(const SceneLightData &sceneLight)
{
    SceneLightData* light = new SceneLightData;
    *light = sceneLight;

    m_lights.push_back(light);
}

そして

SceneLightData* data = m_lights[i];

data->dir = data->dir * follow->getModelviewMatrix().getInverse().getTranspose();         
setLight(*data);
1
追加された 編集された
ビュー: 1
Vector4const vec4typedef ですか?
追加された 著者 Shahbaz,
まあ、 data-> dir = lightDirection; という行にこのエラーがありますか?
追加された 著者 Shahbaz,
data の種類は何ですか? data の宣言だけでなく、どのような型の定義(またはそれが指す型の定義)を提供してください。
追加された 著者 Mankarse,
addLight を終了すると light の存在が止まるので、関数の戻り時に m_lights m_lights から削除されたときや Scene が破壊されたときに、 m_lights.push_back(new SceneLightData(sceneLight));
追加された 著者 Mike DeSimone,

2 答え

data->dir is constant. It means you cannot change it, and you are trying to assign a different value to it, that's why compiler is getting mad at you. See const-correctness for more.

1
追加された
@ user991673:O_oそのコードは問題があります。あなたは割り当てられたスタックオブジェクトのアドレスを取得し、そのオブジェクトが存在するスコープから離れることになります。後の段階でそのポインタを介して light にアクセスしようとした結果は未定義です。
追加された 著者 Mankarse,
それは私が思ったことですが、私はconstまたはdirまたはデータのいずれの言及も見つけることができません。 'dir'型の場合はSceneLightData、それが追加されたら次のようになります:void Scene :: addLight(const SceneLightData&sceneLight){SceneLightData light = sceneLight; m_lights.push_back(&light); }
追加された 著者 romeboards,
うん、私はそれについて喜んでいない。私のm_lightsベクトルのメンバーがconstであることを望まないなら、与えられた場合、私は何をしましたか?私はconst_castを使用しようとしましたが、それを正しく遵守しませんでした...
追加された 著者 romeboards,
問題を解決し、私の修正のための元のポストをチェックしてください(スラッシュはまだそれが恐ろしいプログラミングであるかどうかを教えてください)。みんな、ありがとう!
追加された 著者 romeboards,
dirconst であることはほとんどありません。 data が宣言されている場所を調べる必要があります。それはローカル変数ですか?関数に渡されるパラメータ?
追加された 著者 Mike DeSimone,
新しいSceneLightData(sceneLight)オブジェクトで const オブジェクトを初期化して、非constオブジェクトを常に new することができます。
追加された 著者 Mike DeSimone,
@ user991673: dir 自体が一定であれば、 data 内の dir は自動的に一定になります。
追加された 著者 user405725,
const_cast は、最初に const として宣言されていないものに対してのみ動作します。それ以外の場合は、未定義の動作があります。メンバを常に非constにするには、 mutable としてメンバーを宣言できます。さもなければ、まずはそのオブジェクトを非定数として持たないでください。誰かがあなたに定数オブジェクトを渡している場合、それらのオブジェクトが変更されることが最後に期待されることです...あなたのプログラム設計を再考してください。
追加された 著者 user405725,

This error occurs because you are attempting to call a non-const member function on a const object. At some point in your code you are calling the assignment operator of a const vec4.

代入演算子( operator = )は、オブジェクトに代入することで(代入する)オブジェクトを変更するので、非constです。

どのような問題が発生しているかは、あなたの例から明らかではありません。それでも問題が解決しない場合は、問題を示す最小限の完全なプログラムに下げて試してみましょう。

0
追加された