2010-12-11 114 views
0

我有一个代表游戏中捕捉区域的类。这里面类的我有玩家被捕获区的载体(CUtlVector是我使用的SDK载体类)C++通过引用传递一个对象?

typedef CUtlVector<ConquestPlayer*> CappingPlayersType; (defined outside of class) 
CappingPlayersType CapturePlayers; 

在我的游戏管理器类,我想检索玩家的捕捉名单使用此代码。

void GameManager::UpdateCaptureData() 
{ 
    // Loop Active Capture Points 
    for(int i = 0; i < CaptureZones.Count(); i++) 
    { 
     // Get List of Active Players Capturing this Point 
     CappingPlayersType *CapturePlayers = NULL; 
     int CapPlayersCount = CaptureZones.Element(i)->GetPlayersCapturing(CapturePlayers); 


int CTriggerCaptureZone::GetPlayersCapturing(CappingPlayersType &CapPlayers) 
{ 
    CapPlayers = CapturePlayers; 

    return CapturePlayers.Count(); 
} 

它已经有一段时间了,我不记得从函数中检索列表并将其存储在局部变量中的最佳方法。 IIRC由于CapturePlayers对象为NULL,所以我无法通过引用传递,但是我不知所措。任何帮助将非常感激。

+2

你的代码有点令人困惑。看起来好像总是向GetPlayersCapturing函数传递一个空指针,然后试图将它强制转换为引用。你能否更详细地解释你想要做什么,以及为什么CapturePlayers总是NULL? – Cam 2010-12-11 01:22:43

回答

2

你的意思是这样的吗?

const CappingPlayersType& CTriggerCaptureZone::GetPlayersCapturing() const 
{ 
    return CapturePlayers; 
} 

而且在调用函数:

const CappingPlayersType& CapturePlayers = CaptureZones.Element(i)->GetPlayersCapturing(); 
size_t CapPlayersCount = CapturePlayers.size(); 

我还没有在代码(只是想以适应与你有什么)的其余部分看上去太认真,但好像你可能只是想通过const引用返回内部CUtlVector

+0

我*想*他希望它接受一个参数,改变该参数,然后返回一个整数,这就是为什么他想传递一个指针。 – Cam 2010-12-11 01:36:45

+0

@Cam:他可能会想要这样做,但是他应该如何? – 2010-12-11 01:38:15

+1

@Stuart:我不这么认为。特别是当'.Count()'是CapPlayers的成员函数时,我不明白为什么他必须返回count。尽管他向我们展示了有限的背景,但很难说清楚,但我认为这个答案是正确的。有+1。 – Cam 2010-12-11 01:40:58

0

我不知道GetPlayersCapturing()调用后你在做什么,但我认为通过返回count和一个对真实数据的引用来重载一个调用只会让你动起来,除非你想去与原始指针一起工作。

为什么不能有一个函数返回计数,一个函数返回一个引用,并一个接一个地调用它们?无需传递不良数据,预先初始化或浪费更多时间。

2

如果我理解正确,您希望传入CapturePlayers,并让GetPlayersCapturing负责初始化它。

你有两个选择:

  1. 你可以做CapturePlayers一个指针,并接受它作为GetPlayersCapturing的指针。你可以将它设置为NULL,将它传入,GetPlayersCapturing会为它分配内存/初始化它。

  2. 你可以声明CapturePlayers作为这样一个局部变量:

    CappingPlayersType CapturePlayers; 
    

    然后,你可以接受它作为GetPlayersCapturing的参考,这将返回计数之前对其进行修改。

最终,您选择的这些取决于您,它取决于您在此处显示的更多上下文。不过,我强烈建议选项2,只是因为你应该尽可能避免处理指针。