我是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似乎没有想到,但我仍然对指针赋值和正确使用dereference运算符感到非常困惑。相关问题:此代码是否会将正确的播放器名称插入gameLog
?我可以确定将currentPlayer
传递给changeGmState()
与传递player0
或player1
的工作方式相同吗?任何其他反馈表示赞赏。在此先感谢您的帮助。
答案 0 :(得分:3)
作业应该是:
if (player0First)
currentPlayer = player0 ;
else
currentPlayer = player1 ;
指针只是变量,将地址保存到内存中的某个位置。如果单独使用指针变量,它将只是数据的地址。
*player0
使用此功能时,您将访问存储在内存中地址的数据。
在此分配之后,变量currentPlayer将包含与player0(或player1)相同的地址,如果使用*currentPlayer
,您将访问相同的数据(因为它是相同的地址)。
注意:
currentPlayer->name
这只是
的捷径(*currentPlayer).name
答案 1 :(得分:3)
您在此处取消引用RHS中的指针:
currentPlayer = *player0 ;
// ^ dereference, gives object pointed at by player0
您需要指定一个指针,即使LHS上的指针与RHS上的指针相同:
currentPlayer = player0 ;
答案 2 :(得分:3)
play()函数中currentPlayer的赋值是否正确?
没有。 C ++指针语法有点令人困惑,因为*可能意味着几件事。表达式Player *currentPlayer ;
表示您正在创建一个指向Player对象的指针(也就是说,currentPlayer是一个存储Player所在的内存地址的变量。当您说*currentPlayer
时,它意味着你希望Player对象存储在那个内存地址(这称为取消引用指针)。说currentPlayer = *player0 ;
没有意义;它说要将Player对象(*player0
)存储在一个对象中只存储内存地址(currentPlayer
指针)。正如已经提到的那样,解决方案就是说
currentPlayer=player0;
基本上意味着“将当前播放器的内存地址设置为与player0
指向的内存地址相同”。您也可以将其视为“make currentPlayer
指向同一个player0
指向的内容。”
关于您的其他问题,
“此代码会将正确的玩家名称插入gameLog吗?”
是。 *gameLog
正确取消引用gameLog
指针。
我可以确定将currentPlayer传递给changeGmState的工作方式与传入player0或player1相同吗?
是的,假设currentPlayer
已设置为player0
或player1
。
答案 3 :(得分:2)
if (player0First)
currentPlayer = *player0 ;
else
currentPlayer = *player1 ;
在此处小心 - 您将这两个Player*
分配给Player
s
摆脱引用:
if (player0First)
currentPlayer = player0 ;
else
currentPlayer = player1 ;
答案 4 :(得分:2)
您可以使用
currentPlayer = player0 ; //currentPlayer now contains the address contained by Player0
currentPlayer = player1 ; //currentPlayer now contains the address contained by Player1