0

我对 C++ 完全陌生,我唯一的编程经验是使用 Java。我仍在尝试处理指针。我将如何分配一个指针来指向第二个指针指向的同一个对象?具体来说,我想指定currentPlayer指向player0or 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()传递相同吗?任何其他反馈表示赞赏。在此先感谢您的帮助。player0player1

4

5 回答 5

3

作业应该是:

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

指针只是一个变量,用于保存指向内存中某个位置的地址。如果单独使用指针变量,它只是数据的地址。

*player0

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

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

笔记:

currentPlayer->name

这只是一个捷径

(*currentPlayer).name
于 2013-10-25T05:23:49.087 回答
3

您在此处取消引用 RHS 中的指针:

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

您需要分配一个指针,即使 LHS 上的指针指向与 RHS 上的相同的东西:

currentPlayer = player0 ;
于 2013-10-25T05:24:10.663 回答
3

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

不,C++ 指针语法有点令人困惑,因为 * 可能意味着几件事。该表达式Player *currentPlayer ;意味着您正在创建一个指向 Player 对象的指针(即 currentPlayer 是一个变量,用于存储 Player 所在的内存地址。当您说*currentPlayer时,这意味着您希望将 Player 对象存储在该内存地址(这被称为取消引用指针)。说currentPlayer = *player0 ;真的没有意义;它说将 Player 对象(*player0)存储在只存储内存地址(currentPlayer指针)的对象中。正如已经提到的那样,解决方案是说

currentPlayer=player0;

这基本上意味着“将当前播放器的内存地址设置为与指向的相同player0。” 你也可以把它想象成“使currentPlayer指向同一事物player0指向”。

关于你的其他问题,

“这段代码会在gameLog中插入正确的玩家名字吗?”

是的。*gameLog正确地取消引用gameLog指针。

我可以确定将 currentPlayer 传递给 changeGmState 与传递 player0 或 player1 的工作方式相同吗?

是的,假设currentPlayer已设置为player0player1

于 2013-10-25T05:30:00.517 回答
2
if (player0First)
    currentPlayer = *player0 ;
else
    currentPlayer = *player1 ;

在这里小心——你将这两个Player*s 分配给Players

摆脱取消引用:

if (player0First)
    currentPlayer = player0 ;
else
    currentPlayer = player1 ;
于 2013-10-25T05:24:37.240 回答
2

您可以使用

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

currentPlayer = player1 ; //currentPlayer now contains the address contained by Player1 
于 2013-10-25T05:27:11.720 回答