2012-04-23 53 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 2012-04-23 12:16:01

+0

只是通过价值不是吗?所以当玩家更新相机时不会更新。 – rocklobster 2012-04-23 12:19:05

+0

阅读解释的答案有很多他们 – Cynede 2012-04-23 12:20:19

回答

3

在C#中,对象(类)变量是隐式指针。因此,如果您的类Camera的字段p的类型为Player,则在代码中设置cam.p = player会使两个引用都指向同一个实例。通常不需要使用ref,除非您通过引用传递值类型(int,float,structs等)。

+0

感谢您的额外信息。 – rocklobster 2012-04-23 12:28:44

0

课总是通过引用传递,所以你并不需要裁判一点,你正在尝试做

简单

cam.setFollow(player); 
1

应该有不需要在这里使用ref关键字,因为对象总是通过C#中的引用传递。在C#中的ref关键字通常更像是指针(**)将用于C/C++

+0

感谢您的好解释。 – rocklobster 2012-04-23 12:27:22

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