2012-04-23 8 views
0

スコープ外で作成されたクラス内の変数をトラッキングしたいとします。私はちょうどこのようなポインタを渡すだろうC + +で。メンバ変数をクラス外のオブジェクトに設定する

class Camera 
{ 
    Player* player; 
    Position pos; 

    void setFollow(Player* pl) { pl = player; } 
    void update() { pos = pl->getPos(); } 
} 

int Main() 
{ 
    Camera* camera = new Camera(); 

    Player* player = new Player(); 

    camera->setFollow(player); 
} 

C#では参照渡ししようとしましたが、動作しませんでした。

public class Game1 : Microsoft.Xna.Framework.Game 
{ 
    Camera cam = new Camera(); 
    Player player = new Player(); 

    cam.setFollow(ref player); // <-- by reference 
} 

これは実際のコードの短縮版です。

ありがとうございました。

編集:すべての情報に感謝します。

+3

多分setFollow(プレイヤー)? – Cynede

+0

それはちょうど価値によって渡すだろうか?だから、プレイヤーがカメラを更新したときには更新されません。 – rocklobster

+0

解説を読んでそこにたくさんのものがあります – Cynede

答えて

3

C#では、オブジェクト(クラス)変数は暗黙的にポインタです。したがって、クラスCameraにフィールドpPlayerの場合、コードにcam.p = playerを設定すると、両方の参照が同じインスタンスを指しているままになります。参照型で値のタイプ(intfloatstructsなど)を渡さない限り、通常はrefを使用する必要はありません。

+0

追加情報をありがとう。 – rocklobster

0

ここREFについて を詳細を読むことができますが、参照を必要としないので、クラスは常に参照によって渡されますが、あなたは、単に

cam.setFollow(player); 
1

をやろうとしていることをビットがあるはずですオブジェクトは常にC#で参照渡しされるため、refキーワードを使用する必要はありません。 C#のrefキーワードは、通常、ポインタへのポインタ(**)がC/C++で使用されるように使用されます。

+0

良い説明をありがとう。 – rocklobster

0

ref C#のキーワードは本当に悪い名前です。それはあなたが参照渡しを意味するものではありません!それはaliasという名前にしておかなければなりません。なぜならこれはrefの意味を表す良い言葉です。

// here I assign a reference(another bad name :)) 
// you can also call it Garbage Collector Handler 
// of type Player with a new object 
Player player = new Player(); 
// ref means that player is the same thing that parameter pl of setFollow 
cam.setFollow(ref player); 

More details

関連する問題