2010-12-11 3 views
0

У меня есть класс, представляющий зону захвата в игре. Внутри этого класса у меня есть вектор игрока, которые захватывают эту зону (CUtlVector вектор класс из SDK я использую)C++ Передача объекта по ссылке?

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

В моем классе GameManager, я пытаюсь получить список захвата игрока используя этот код.

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

ответ

2

Вы имеете в виду что-то вроде этого?

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

И в вызывающей функции:

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

Я не смотрел слишком внимательно на остальной части кода (просто пытается вписаться в то, что у вас есть), но это, кажется, как вы может просто потребовать вернуть внутреннее значение CUtlVector по ссылке const.

+0

Я * думаю * он хочет, чтобы он принимал аргумент, мутировал этот аргумент, а затем возвращал целое число, поэтому он хотел передать указатель. – Cam

+0

@Cam: Он может * хотеть * сделать это, но должен ли он? –

+1

@ Стюарт: Я так не думаю. В частности, я не понимаю, почему он должен возвращать счет, когда '.Count()' является функцией-членом CapPlayers в любом случае. Трудно сказать, учитывая ограниченный контекст, который он нам показал, но я думаю, что этот ответ на правильном пути. У вас есть +1. – Cam

0

Я понятия не имею, что вы делаете после вызова GetPlayersCapturing(), но я думаю, что перегрузка одного вызова, возвращая как счет, так и ссылку на реальные данные, просто собирается вас отпустить, если вы не хотите идти работа с необработанными указателями.

Почему нет одной функции, возвращающей счет, одна функция возвращает ссылку и вызывает их один за другим? Не нужно передавать плохие данные, предварительно инициализировать или тратить на это дополнительное время.

2

Если я правильно понял, вы хотите передать CapturePlayers, и GetPlayersCapturing позаботится об инициализации.

У вас есть два варианта:

  1. Вы могли бы сделать CapturePlayers указатель, и принять его как указатель в GetPlayersCapturing. Вы должны установить его в NULL, передать его, и GetPlayersCapturing будет выделять для него память/инициализировать его.

  2. Вы можете объявить CapturePlayers в качестве локальной переменной, как это:

    CappingPlayersType CapturePlayers; 
    

    Тогда вы могли бы принять его в качестве ссылки в GetPlayersCapturing, который бы изменить его до возвращения графа.

В конечном счете, какой из них вы выбираете, зависит от вас, и это зависит от большего контекста, чем вы показали здесь. Однако я настоятельно рекомендую вариант 2, просто по той причине, что вам следует избегать использования указателей, когда это возможно.

Смежные вопросы