C ++更新结构偏移量

时间:2017-12-21 14:29:29

标签: c++ struct

当我尝试使用make函数来设置网格时,我得到错误E0137。 getMeshes效果很好。 当我试图做一些像

这样的想法
RpMesh* a = header->GetMeshes();
a = newMeshes;

这也不起作用。

struct RpMeshHeader
{
    unsigned int   flags;
    unsigned short numMeshes;
    unsigned short serialNum;
    unsigned int   totalIndicesInMesh;
    unsigned int   firstMeshOffset;
    RpMesh *getMeshes(void) { return (RpMesh*)(this + 1); }
    void setMeshes(RpMesh* newMesh)
    {
        (RpMesh*)(this + 1)= newMesh;
    }
    bool isValidMeshId(int meshId)
    {
        return (meshId != NULL && numMeshes >= meshId);
    }
}

整个文件 https://github.com/CrosRoad95/mtasa-blue/blob/f740b0d7410f33ff323cad25bf897725ad44d7d3/Client/sdk/game/RenderWare.h

1 个答案:

答案 0 :(得分:0)

这里的错误很清楚:

void setMeshes(RpMesh* newMesh)
{
    (RpMesh*)(this + 1)= newMesh;
}
  

错误:左值作为赋值的左操作数

以下内容不是lvalue,因此您无法分配给它。

(RpMesh*)(this + 1)

您链接的github将setMeshes显示为以下

void setMeshes(RpMesh* newMeshes)
{
    RpMesh* meshes = (RpMesh*)(this + 1);
    meshes = newMeshes;
}

在语法方面很好。首先,您创建一个指针meshes,您为其分配(this+1)的地址(如果this是一个数组,this+1将指向数组中的下一个元素)但是演员!

您将这个假设的下一个元素在RpMeashHeaderRpMesh的数组中使用C风格的强制转换(在这种情况下afaik默认为reinterpret_cast,请参阅{{3} }了解更多信息)

但是这个内存每次都被分配了吗?这似乎不安全。