【问题标题】:lvalue required as left operand of assignment C++ compilation error左值需要作为赋值的左操作数 C++ 编译错误
【发布时间】:2012-05-04 08:48:37
【问题描述】:

我正在尝试构建一个扫雷游戏,但我不断收到编译错误:需要左值作为赋值的左操作数。仅在这两行:

#include <iostream>
#include <ctime>
using namespace std;

// ------------------------------------------------------
// class Cell
// represents one grid element in the Minesweeper game
// ------------------------------------------------------

class Cell {
public:
    Cell();
    void print();
    void peek();
    void unittest();
    void setMined(bool);
    bool getMined();
    void setAdj(int);
private:
    bool covered;
    bool marked;
    bool mined;
    int adjcount;
};


// ------------------------
// functions for class Cell
// ------------------------

Cell::Cell(){
    covered = true;
    marked = false;
    mined = false;
    adjcount = 0;
//  cout << "Creating a Cell" << endl;
}

void Cell::setAdj(int n){
    adjcount = n;
}

bool Cell::getMined(){
    return mined;
}

void Cell::setMined(bool b){
    mined = b;
}

void Cell::print(){
    if (marked) cout << " L ";
    else {
        if (covered) cout << " ? ";
        else{
            if (mined) cout << " @ ";
            else if (adjcount == 0) cout <<  " _ ";
            else cout << " " << adjcount << " ";
        }
    }  
}

void Cell::peek(){
    if (mined) cout << " @ ";
    else if (adjcount == 0) cout << " _ ";
    else cout << " " << adjcount << " ";
}

void Cell::unittest(){
    print(); cout << endl;

    covered = false;
    print(); cout << endl;

    adjcount = 4;
    print(); cout << endl;

    mined = true;
    print(); cout << endl;

    covered = true;
    print(); cout << endl;

    marked = true;
    print(); cout << endl;
}

// -------------------------------------
// class Board
// this class represents a 2 dimensional
// array of Cell objects for the game
// of minesweeper
//--------------------------------------

class Board{
public:
    Board();
    void print();
    void peek();
    void adjacencycount();
    void mixMined();
private:
    static const int rows = 5;
    static const int cols = 5;
    Cell cells [rows][cols];
    int mines;
};

// --------------------------
// functions for class Board
// --------------------------
Board::Board(){
    mines = 6;
        for(int i = 0; i < 1 ; i++){
            for(int j = 0; j < mines; j++){
                cells[i][j].setMined(true);
            }
        }
}

void Board::mixMined(){
    int shuffle = 1000;
    for(int i = 0; i < shuffle; i++){
        int r1 = (rand()%rows);
        int c1 = (rand()%cols);
        int r2 = (rand()%rows);
        int c2 = (rand()%cols);
        if(r1 && c1 != r2 && c2){
            bool temp = cells[r1][c1].getMined();
            cells[r1][c1].getMined() = cells[r2][c2].getMined();
            cells[r2][c2].getMined() = temp;
        }
     }

}

void Board::adjacencycount(){ 

    for( int i = 0; i < rows; i++){      
        for( int j = 0; j < cols; j++){ 
            if(!cells[i][j].getMined()){
                int count = 0;
                    if (i-1 >= 0 && j-1 >= 0 && cells[i-1][j-1].getMined()) count++;
                    if (i-1 >= 0 && cells[i-1][j].getMined()) count++;
                    if (i-1 >= 0 && j+1 <= cols-1 && cells[i-1][j+1].getMined()) count++;                                          
                    if (j-1 >= 0 && cells[i][j-1].getMined()) count++;
                    if (j+1 <= cols-1 && cells[i][j+1].getMined()) count++;                                       
                    if (i+1 <= rows-1 && j-1 >= 0 && cells[i+1][j-1].getMined()) count++;
                    if (i+1 <= rows-1 && cells[i+1][j].getMined()) count++;
                    if (i+1 <= rows-1 && j+1 <= cols-1 && cells[i+1][j+1].getMined()) count++;
                    cells[i][j].setAdj(count);              
                    // cout << count; -- for testing purposes
            }
        } 
    }
}

void Board::print(){
        for (int i = 0; i < rows; i++){
                for (int j = 0; j < cols; j++){
                        cells[i][j].print();
                                        }
                cout << endl << endl;
        }
}

void Board::peek(){
        for (int i = 0; i < rows; i++){
                for (int j = 0; j < cols; j++){
                        cells[i][j].peek();
                }
                cout << endl << endl;
        }
}

// -------------------------
// main function for testing
// -------------------------

int main(void) {
    //Cell c;
    //c.unittest();
    srand(time(0));

    Board b;
    b.mixMined();
    b.adjacencycount();
    b.peek();

    return 0;
}

我正在尝试让我的细胞交换,以便地雷会随机化每个新游戏。我四处寻找,找不到解决方案。我添加了“==”,但该功能不会做我想做的事。

++EDIT++ 很抱歉它确实声明了需要左值,我错过了输入

minesweeper.cpp: In member function ‘void Board::mixMined()’:
minesweeper.cpp:130: error: lvalue required as left operand of assignment
minesweeper.cpp:131: error: lvalue required as left operand of assignment

这就是发生的错误。

【问题讨论】:

  • getMinded 返回什么(准确)?
  • 能否请您发布完整代码。
  • getMined()的签名是什么?它应该类似于bool&amp; getMined()。 (注意参考。)
  • 我敢打赌错误消息说“需要左值”。
  • 能否请您发布完整的编译错误消息?

标签: c++ compilation lvalue


【解决方案1】:

我认为getMined()实际上是这样的:

bool getMined()

所以你试图分配给rValue 这是不可能的

你可能想写一些函数,比如:

void setMined(bool m) 并像这样使用它:

cells[r1][c1].setMined( cells[r2][c2].getMined() );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-10
    • 2012-04-09
    • 1970-01-01
    • 2011-12-20
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多