0

私は C++ はまったく初めてで、プログラミングの経験は Java だけです。私はまだポインターを処理しようとしています。2 番目のポインターが指しているのと同じオブジェクトを指すようにポインターを割り当てるにはどうすればよいですか? 具体的には、またはの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
}

currentPlayer関数内のへの代入はplay()正しいですか? Xcode はそうではないと考えているようですが、ポインターの代入と間接参照演算子の適切な使用について、私はまだひどく混乱しています。関連する質問: このコードは正しいプレイヤー名を に挿入しますgameLogか? currentPlayerに渡すと or を渡すのchangeGmState()と同じように機能することを確認できますplayer0player1? その他のフィードバックは大歓迎です。よろしくお願いします。

4

5 に答える 5

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 に答える
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 に答える
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 に答える
2
if (player0First)
    currentPlayer = *player0 ;
else
    currentPlayer = *player1 ;

ここで注意してください -- これらPlayer*の のPlayer両方を に代入しています

逆参照を取り除きます。

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