为第一个指针指向的对象分配第二个指针

问题描述:

我完全不熟悉C++,并且我唯一的编程经验是使用Java。我仍然试图得到指针的句柄。我将如何分配一个指针指向第二个指针指向的相同对象?具体来说,我想指定currentPlayer指向player0player1,并随着游戏状态的变化来回切换。为第一个指针指向的对象分配第二个指针

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 
} 

是在play()功能正确分配给currentPlayer? Xcode似乎不这么认为,但我仍然对指针赋值和正确使用解引用操作符感到非常困惑。相关问题:此代码是否将正确的玩家名称插入gameLog?我可以确定通过currentPlayerchangeGmState()的工作方式与传递player0player1一样吗?任何其他反馈意见。在此先感谢您的帮助。

play()函数中currentPlayer的赋值是否正确?

编号C++指针语法有点混乱,因为*可能意味着几件事情。表达式Player *currentPlayer ;意味着你正在创建一个指向Player对象的指针(也就是说,currentPlayer是一个存储播放器所在位置的内存地址的变量,当你说*currentPlayer时,这意味着你想让Player对象存储在那个内存地址(这被称为解引用指针),说currentPlayer = *player0 ;没有任何意义;它说存储一个Player对象(*player0)在一个只存储内存地址的对象中(currentPlayer指针)。被提及,就是

currentPlayer=player0; 

这基本上意味着“设置当前播放器的内存地址是作为由player0指向相同的。”你也可以THI它NK为“使currentPlayer指向同一件事player0点。”

至于你的其他问题,

“将这段代码插入正确的玩家名字变成gameLog?”

是的。 *gameLog正确解除对gameLog指针的引用。

我可以确定传递currentPlayer来改变GmState的工作方式与传入player0或player1相同吗?

是,假设currentPlayer已被设置为player0player1

+0

谢谢!这帮助我更好地理解C++指针。 – AdamJames

的分配应该是:

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

指针只是变量保存的地址在内存中的位置。如果单独使用指针变量,它将只是数据的地址。

*player0 

使用此功能时,您正在访问存储在内存地址中的数据。

在此作业之后,变量currentPlayer将包含与player0(或player1)相同的地址,并且如果您使用*currentPlayer,则将访问相同的数据(因为它是相同的地址)。

注:

currentPlayer->name 

这仅仅是一个用于

(*currentPlayer).name 
+0

谢谢,我想确保这一点。 – AdamJames

你解引用指针在这里RHS快捷:

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

您需要分配一个指针,也就是说,要使LHS上的指针与RHS上的指针相同:

currentPlayer = player0 ; 

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

这里小心 - 你要在分配这两个Player* S的Player小号

摆脱解除引用的:

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

您可以使用

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

currentPlayer = player1 ; //currentPlayer now contains the address contained by Player1