неверная инициализация неконстантной ссылки - PullRequest
0 голосов
/ 07 ноября 2011

Я пытаюсь сослаться на переменную класса, которая является вектором, и изменить значение вектора. Я получил эту ошибку. Что я делаю неправильно? заранее спасибо. («выбор» - просто int.)

 class tic
{
private:
vector<int> move;   //calculate moves
vector<int> value1; //player1's points
vector<int> value2; //player2's points
vector<int> value;  //exchange value
vector<string> board;   //numbers on the board
public:
void setboard ();   //output numbers on the board
void setvalue();    //each number's value corresponding to the numbers on the board
void setvalue12();  //values of player1 and playe2
void set(); //setboard, setvalue, setvalue12
void printboard (int &pick); //print board
int pick(int &m);       //pick a number on the board
bool sum15 (vector<int> &sum15);  //check if sum is 15 of any combination of 3
int WinLoseDraw (int &pick, int player);    //win=0, continue=1, draw=20
void WLD(int &player)
{   
    vector<int> &temp=(player==1)?this->value1:this->value2;
    temp[pick-1]=value[pick-1]; //input values
    if (sum15(temp))    //if any sum of 3 is 15
    {
        cout<<"WINS!"<<endl;
    }
}

};

это оригинальные коды. Я пытаюсь просто эту часть с функцией-членом или встроенной функцией с именем WLD

    if (player==1)  
    {       
        value1[pick-1]=value[pick-1];   //input values

        if (sum15(this->value1))    //if any sum of 3 is 15
            {
                cout<<"PLAYER1 WINS!"<<endl;
                return 0;
            }
    }
    else  
    {
        value2[pick-1]=value[pick-1];

        if (sum15(this->value2))
        {
            cout<<"PLAYER2 WINS!"<<endl;
            return 0;
        }
    }

с обновленными кодами. Я получил сообщение об ошибке "temp [pick-1] = value [pick-1];

tic.h: In member function ‘void tic::WLD(int&)’:
tic.h:28: error: invalid use of member (did you forget the ‘&’ ?)
tic.h:28: error: invalid use of member (did you forget the ‘&’ ?)

Ответы [ 4 ]

2 голосов
/ 07 ноября 2011

Ссылка не присваивается, только конструктивно.Вы можете попробовать сделать:

vector<int>& temp = ( player == 1 ) ? this->value1 : this->value2;

Обновление:

С обновленным кодом все, что вам нужно сделать, это сбросить const в temp, чтобы сделатьэто работает.Обратите внимание, что у вас есть lvalues ​​, r в rvalues ​​ происходит не от reference , а от right , как вможно использовать с правой стороны выражения.

0 голосов
/ 07 ноября 2011

После инициализации ссылки ее нельзя повторно инициализировать или назначить.

Похоже, вы пытаетесь это сделать, используя троичный (или условный) оператор :

const vector<int>& values = (player == 1) ? value1 : value2;

Вы говорите:

(«выбор» - просто целое число)

Ваш код говорит:

int pick(int &m);

pick здесь используется метод , а не int.

Если вы компилируете с g++, я рекомендую включить (как минимум) -Wshadow,который предупредит, когда вы совершите такую ​​ошибку.Вы сделали то же самое с sum15.

0 голосов
/ 07 ноября 2011

Ссылка не может быть переназначена, вы объявляете ее, а затем в if устанавливаете ее на новое значение.

Я не думаю, что вы должны пытаться использовать ссылку в этом случае.

0 голосов
/ 07 ноября 2011

Я думаю, что ваша ошибка в строке vector<int> &temp=vector<int>().Однако не совсем понятно, что вы здесь делаете, поскольку вы пытаетесь присвоить &temp, а затем немедленно переназначить его в ветвях оператора if-else.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...