2010-11-14 3 views
1

им получить эти две ошибкис ++ IntelliSense: выражение должно быть изменяемым Lvalue

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

ответ

4

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

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

+0

Избито на 10 секунд ... Причина забытое ключевое слово mutable. – Dialecticus

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^