c ++ IntelliSense: выражение должно быть изменяемым lvalue - PullRequest
1 голос
/ 15 ноября 2010

я получаю эти две ошибки

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

я объявил pDrawMesh в своем классе, чем использовал его в одной функции.
здесь мой класс

class CXFileEntity
{
        ......
 LPD3DXMESH pDrawMesh;
        .....
};

здесь яиспользовал переменную

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);
 }
}

Ответы [ 2 ]

4 голосов
/ 15 ноября 2010

Ваша функция-член является константной. Вы не можете изменять какие-либо переменные-члены из соответствующей функции-члена, если они не объявлены изменяемыми.

Вам нужно сделать pDrawMesh изменяемым, удалить квалификацию const из DrawMeshContainer или найти какой-либо другой способ достичь того, чего вы пытаетесь достичь.

0 голосов
/ 15 ноября 2010

pDrawMesh действительно this->pDrawMesh.Но поскольку текущий метод является const методом, this является const CXFileEntity*.Таким образом, вы не можете установить элемент pDrawMesh.

Если DrawMeshContainer действительно должен изменить CXFileEntity, удалите этот const из типа метода.Если DrawMeshContainer «эффективно» поддерживает постоянную CXFileEntity и элемент pDrawMesh «на самом деле не имеет значения» для вашего значения const для объекта, вы можете изменить элемент на mutable.

...