作为赋值C ++编译错误的左操作数需要左值

时间:2012-05-04 08:48:38

标签: c++ compilation lvalue

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

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

我正试图让我的细胞交换,这样地雷会随机化每一个新游戏。我四处搜寻,无法找到解决方案。我添加了“==”但该功能不会按照我想要的那样做。

++编辑++我很抱歉它确实需要状态左值,我错过了输入

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

发生错误。

1 个答案:

答案 0 :(得分:5)

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

bool getMined()

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

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

void setMined(bool m)并使用它:

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