循环中分配的多维数组说明:表达式必须是可修改的左值

Posted

技术标签:

【中文标题】循环中分配的多维数组说明:表达式必须是可修改的左值【英文标题】:Multidimensional array assigning in loop stating: expression must be a modifiable lvalue 【发布时间】:2018-01-30 06:51:13 【问题描述】:

所以在一个类中,我有一个这样的数组:

public:
    int playGrid[10][10];//size of the grid, 10x10 or 100 squares

当我这样做时:

        for (int i = iX1; i < iX2; i++)
        
            if (i == iX1)
            
                playGrid[i][iY1] = 4;
            
        

这个:

playGrid[i][iY1] = 4;

给我:

expression must be a modifiable lvalue

我不确定我在这里做错了什么。此代码位于该类的方法之一中,因此它可以访问它。我到处找遍了,但我找不到他们使用带有简单整数赋值的二维数组的示例。

感谢您的帮助!

编辑:请求了更多代码,所以我们开始吧:

void Grid::placeBoat(int iX1, int iY1, int iX2, int iY2) const

    if (iX1 != iX2)
    
        if (iX1 < iX2)
        
            for (int i = iX1; i < iX2; i++)
            
                if (i == iX1)
                       
                    playGrid[i][iY1] = 4;
                
            
        
        else
        

        
    
    else if (iY1 != iY2)
    

    

这里是网格类:

class Grid

public:
    int playGrid[10][10];//size of the grid, 10x10 or 100 squares
    void drawGrid() const;
    void placeBoat(int, int, int, int) const;
    Grid();
    ~Grid();
;

【问题讨论】:

不是您的错误的确切原因,但我认为您的意思是 if (i == iX1) 而不是 if (i = iX1) 需要查看更多代码。错误不在您发布的代码行中(即使错误消息是)。 @john 我已按要求添加了更多代码。 @liliscent 哦。是的。就是这样......我现在觉得自己很愚蠢。 【参考方案1】:
void Grid::placeBoat(int iX1, int iY1, int iX2, int iY2) const

看到定义末尾的const了吗?这意味着您可以在实例(Grid)为常量时调用此方法。

由于您允许该调用,因此将编译整个函数体,假设 this 的类型为 const Grid *

然后您尝试更改数组,它是 (const) Grid 的成员,因此编译器错误。

【讨论】:

【参考方案2】:

问题在于,在 const 方法中,您试图修改对象。去掉常量

class Grid

    ...
    void placeBoat(int, int, int, int);
    ...
;

void Grid::placeBoat(int iX1, int iY1, int iX2, int iY2)

    ...

【讨论】:

以上是关于循环中分配的多维数组说明:表达式必须是可修改的左值的主要内容,如果未能解决你的问题,请参考以下文章

表达式必须是可修改的左值(字符数组)

C 错误:表达式必须是可修改的左值

指向函数指针的指针 - 表达式必须是可修改的左值

为啥我得到的表达式必须是可修改的左值?

C++ 表达式必须是可修改的左值

C++的结构体指针中出错:表达式必须是可修改的左值_最后发现解决方法很简单