2017-07-26 2 views
0

Player_Spriteというクラスがあります。私はこのように世界的にそのインスタンスを宣言している:私が試したC++グローバルオブジェクトの値を失う

Header: 
     shared_ptr <Player_Sprite> MainPlayer; 

CPP: 
     shared_ptr <Player_Sprite> MainPlayer = make_shared<Player_Sprite>(); 

:私は気づいた

Player_Sprite player = (*MainPlayer); 
//Do more here 

私は、以前のプレーヤーで設定した値を失うことになります。

Player.SetState(Moving); //Example 

プレイヤーは状態を失いますが、まだ停止しています。

しかし、私はPlayer_Spriteのこのインスタンスを参照して、それをコピーせずに私の値がどこに行くのか疑問に思うままにしています。

+2

オムを書くことができるようにあなたは、より多くの何かの標準にあなたのケースの規則を変更することができればさらに良いでしょうか?構造体メンバへのポインタアクセス演算子 ' - > 'は何もコピーしません。実際の問題を詳しく教えていただけますか?好ましくは[最小限の、完全で検証可能な例](http://stackoverflow.com/help/mcve)。おそらく、あなたも同様にプログラムをデバッグする必要がありますか?次に、Eric Lippertによる[小さなプログラムのデバッグ方法](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を読んでみてください。 –

答えて

3

、それは通常のポインタであるかのようにジャストshared_ptrを使用します。

MainPlayer->SetState(Moving); 

使用されることを意図しています方法です。

Player_Sprite player = (*MainPlayer); 

は、プレイヤーを逆参照してそのコピーを作成します。コピーを変更した場合、オリジナルはもちろん変更されません。

+0

ありがとうございます。どのように私はそれについて行く必要があるか完全にはわからなかった。だから、ポインタで私はそれらを意図した通りに参照するべきです - >? – trevster344

+1

@ trevster344メンバーにアクセスしたいのであれば、通常は ' - >'を使用します。 – idmean

1

Player_Sprite player = (*MainPlayer);は、*MainPlayerの値のコピーをとります。これはあなたの "価値を失う"ことを説明します。

代わりにPlayer->SetState(Moving);を使用してください。 std::shared_ptrは、メンバーオペレーター->へのポインターに対して賢明なオーバーロードを持っています。これは、あなたが裸のポインターと同じように使用できることを意味します。

あなたは何をかなり読みやすく

player->setState(Moving);

+0

ありがとうございます。これは役に立ちました。 – trevster344

関連する問題