2013-10-25 2 views
0

Я совершенно не знаком с C++, и мой единственный опыт программирования - это Java. Я все еще пытаюсь получить ручку указателей. Как назначить указатель на тот же объект, на который указывает второй указатель? В частности, я хочу назначить currentPlayer на player0 или player1 и переключиться взад и вперед по мере изменения состояния игры.Назначение второго указателя на объект, на который указывает первый указатель

using namespace std ; 

struct Player { 
public: 
    string name ; 
    //fields 
}; 

class Game { 
private: 
    Player *player0 ; 
    Player *player1 ; 
    Player *currentPlayer ; 
    bool player0First ; 
    stringstream *gameLog ; 
    //more fields 

public: 
    void play() ; 
    void changeGmState(Player*) ; 
    //other member functions, etc. 
} ; 

void Game::play() { 
    if (player0First) 
     currentPlayer = *player0 ; 
    else 
     currentPlayer = *player1 ; 
    *gameLog << "It's " << currentPlayer->name << "'s turn!" << endl ; 
    changeGmState(currentPlayer) ; 
    //code 
} 

ли назначение currentPlayer в play() функция правильно? Xcode, похоже, не думает, но меня все еще ужасно путают назначение указателя и правильное использование оператора разыменования. Связанные вопросы: будет ли этот код вставить правильное имя игрока в gameLog? Могу ли я быть уверенным, что прохождение currentPlayer до changeGmState() будет работать так же, как и в player0 или player1? Любые другие отзывы приветствуются. Заранее спасибо за вашу помощь.

ответ

3

Правильно ли задано значение currentPlayer в функции play()?

№ Синтаксис указателя Си ++ немного запутан, так как * может означать несколько вещей.Выражение Player *currentPlayer ; означает, что вы создаете указатель на объект Player (то есть currentPlayer - это переменная, которая хранит адрес памяти, в котором находится Player. Когда вы говорите *currentPlayer, это означает, что вы хотите, чтобы объект Player был сохранен на этом адрес памяти (это называется разыменование указателя). Высказывание currentPlayer = *player0 ; на самом деле не имеет смысла, оно говорит, что для хранения объекта Player (*player0) в объекте, который хранит только адреса памяти (указатель currentPlayer). было сказано, есть

currentPlayer=player0; 

, который в основном означает «установить адрес памяти текущего игрока, который будет таким же, как указывает player0.» Вы также можете Тхи пк это как «сделать currentPlayer указывают на одно и то же player0 очков.»

В отношении других ваших вопросов,

«будет этот код вставить правильное имя игрока в gameLog?»

Да. *gameLog Правильные разметки gameLog Указатель.

Могу ли я быть уверенным, что текущий currentPlayer для измененияGmState будет работать так же, как передача в player0 или player1?

Да, при условии, что currentPlayer был установлен либо player0 или player1.

+0

Спасибо! Это помогло мне лучше понять указатели на C++. – AdamJames

3

Назначение должно быть:

if (player0First) 
    currentPlayer = player0 ; 
else 
    currentPlayer = player1 ; 

Указатель просто переменная держит адрес на место в памяти. Если вы используете только переменную указателя, это будет только адрес данных.

*player0 

При использовании этого параметра вы получаете доступ к данным, хранящимся по адресу в памяти.

После этого назначения переменная currentPlayer будет содержать тот же адрес, что и player0 (или player1), и если вы используете *currentPlayer, вы получите доступ к тем же данным (так как это один и тот же адрес).

Примечание:

currentPlayer->name 

Это просто ярлык для

(*currentPlayer).name 
+0

Спасибо, я хотел быть в этом уверен. – AdamJames

3

Вы разыменования указателя в RHS здесь:

currentPlayer = *player0 ; 
//   ^dereference, gives object pointed at by player0 

Вам нужно присвоить указатель, то есть сделать указатель на точке LHS на ту же самую вещь, что и на RHS:

currentPlayer = player0 ; 
2
if (player0First) 
    currentPlayer = *player0 ; 
else 
    currentPlayer = *player1 ; 

Тщательный здесь - вы присваиваете оба этих Player* с до Player s

Избавиться от разыменовывает:

if (player0First) 
    currentPlayer = player0 ; 
else 
    currentPlayer = player1 ; 
2

Вы можете использовать

currentPlayer = player0 ; //currentPlayer now contains the address contained by Player0 

currentPlayer = player1 ; //currentPlayer now contains the address contained by Player1 
Смежные вопросы