c++ IntelliSense: expression must be a modifiable lvalue
-
10-10-2019 - |
Question
im getting these two errors
1>c:\users\owner\documents\visual studio 2010\projects\monopoly\monopoly\xfileentity.cpp(376): error C3490: 'pDrawMesh' cannot be modified because it is being accessed through a const object
IntelliSense: expression must be a modifiable lvalue
i declared pDrawMesh in my class than used it in one function.
here is my class
class CXFileEntity
{
......
LPD3DXMESH pDrawMesh;
.....
};
here is where i used the variable
void CXFileEntity::DrawMeshContainer(LPD3DXMESHCONTAINER meshContainerBase, LPD3DXFRAME frameBase) const
{
// Cast to our extended frame type
D3DXFRAME_EXTENDED *frame = (D3DXFRAME_EXTENDED*)frameBase;
// Cast to our extended mesh container
D3DXMESHCONTAINER_EXTENDED *meshContainer = (D3DXMESHCONTAINER_EXTENDED*)meshContainerBase;
// Set the world transform But only if it is not a skinned mesh.
// The skinned mesh has the transform built in (the vertices are already transformed into world space) so we set identity
// Added 24/08/10
if (meshContainer->pSkinInfo)
{
D3DXMATRIX mat;
D3DXMatrixIdentity(&mat);
m_d3dDevice->SetTransform(D3DTS_WORLD, &mat);
}
else
m_d3dDevice->SetTransform(D3DTS_WORLD, &frame->exCombinedTransformationMatrix);
// Loop through all the materials in the mesh rendering each subset
for (unsigned int iMaterial = 0; iMaterial < meshContainer->NumMaterials; iMaterial++)
{
// use the material in our extended data rather than the one in meshContainer->pMaterials[iMaterial].MatD3D
m_d3dDevice->SetMaterial( &meshContainer->exMaterials[iMaterial] );
m_d3dDevice->SetTexture( 0, meshContainer->exTextures[iMaterial] );
// Select the mesh to draw, if there is skin then use the skinned mesh else the normal one
pDrawMesh = (meshContainer->pSkinInfo) ? meshContainer->exSkinMesh: meshContainer->MeshData.pMesh;
// Finally Call the mesh draw function
pDrawMesh->DrawSubset(iMaterial);
}
}
Solution
Your member function is const-qualified. You cannot modify any member variables from within a const-qualified member function unless they are declared mutable.
You need to make pDrawMesh
mutable, remove the const-qualification from DrawMeshContainer
, or find some other way to accomplish whatever it is you are trying to accomplish.
OTHER TIPS
pDrawMesh
is really this->pDrawMesh
. But since the current method is a const
method, this
is a const CXFileEntity*
. So you can't set the member pDrawMesh
.
If DrawMeshContainer
really should change the CXFileEntity
, remove that const
from the method type. If DrawMeshContainer
"effectively" keeps the CXFileEntity
constant and the pDrawMesh
member "doesn't really count" toward your meaning of const
for the object, you can change the member to be mutable
.