2012-03-27 6 views
0

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

int main() 
{ 
char input; 
bool Running = true; 
NPC Creatures[MAX_NPCS]; 

//InitCreatures loads the X, Y and Type from the file. I know with vectors I have to 
//resize it as I go along, Which would be included in the function. 
if(Creatures[MAX_NPCS].InitCreatures(Creatures) == false) 
{ 
    Creatures[MAX_NPCS].CleanUp(Creatures); 
    return 0; 
} 

while(Running == true) 
{ 
    cout << "(C)heck an NPC, (A)ttack and NPC or (E)xit the program\n"; 
    cin >> input; 
    switch(input) 
    { 
     case 'C': Creatures[MAX_NPCS].Check(Creatures); break; 
     case 'c': Creatures[MAX_NPCS].Check(Creatures); break; 
     //The Check function just shows the X, Y and Type of the NPC 
     case 'A': Creatures[MAX_NPCS].Attack(Creatures); break; 
     case 'a': Creatures[MAX_NPCS].Attack(Creatures); break; 
     //Attack shows X, Y and type and then removes that NPC from the array. 
     case 'E': Running = false; break; 
     case 'e': Running = false; break; 
     default: cout << "That was not a valid input\n"; break; 
    } 
} 

Creatures[MAX_NPCS].CleanUp(Creatures); 
cout << "Exiting\n"; 
system("PAUSE"); 
return 0; 
} 

Действительно единственная проблема, которую я имею становится Main для запуска функции NPC класса из вектора вместо того, чтобы использовать массив, как у меня сейчас. Я могу легко изменить другие функции в функциях, которые я вызываю, чтобы принять вектор и обработать его правильно.

При попытке использовать вектор для выполнения функций, я был только в состоянии назвать их, когда у меня было что-то вроде этого:

Creatures[1].Attack(Creatures); 

Конечно, когда я называю их, как, что значения не возвращаются правильно и я обычно получаю сообщение об ошибке. Кроме того, я не знаю, сколько NPC будет загружено для текущей карты, если Any.

Любая помощь с этим была бы оценена. Я понимаю, что я новичок, когда дело доходит до программирования, особенно когда речь заходит о Vectors. Если мне нужен код функции, я с радостью опубликую его.

+1

Erm, доступ как 'Creatures [MAX_NPCS]' является неопределенным поведением. У вас есть только индексы до 'MAX_NPCS-1'. – Xeo

+0

Ой, хорошо, поймай. Кроме того, почему я хочу векторов. Но я чувствую, что не понимаю их правильно. В любом случае функции имеют защиту, которая мешает вам добавлять слишком много NPC и делает это правильно: P – Mattycaeks

+0

'std :: vector' - не более, чем хороший пакетный динамический массив. Просто в .push_back' вещи в него и получить их с нормальным доступом к массиву ('operator []'). Что говорит об этом ваша книга по программированию? – Xeo

ответ

0

Вы можете просто создать вектор и иметь первый элемент там, чтобы иметь возможность вызвать функцию InitCreatures (вы также можете перезаписать первое существо позже).

vector<NPC> Creatures(1); 
Creatures[0].InitCreatures(Creatures); 

Я предполагаю, что в классе у вас есть параметр, переданный по ссылке.

bool InitCreatures(vector<NPC>& x) { ... } 

Но так как вы даете существо в качестве параметра каждой функции вы должны (сделать это необходимо в чеке или нападении?) - не было бы лучше, чтобы иметь класс для хранения вектора NPC?

+0

Это работает до момента, когда мне нужно добавить больше к вектору. Поскольку все NPC загружаются внутри этой функции, как изменить размер вектора. Если я попытаюсь в функции тогда хорошо, мой компьютер не нравится. – Mattycaeks

+0

Ах, неважно. Кажется, это было нечто другое. По какой-то нечетной причине его работа прекрасна. Я просто забыл изменить некоторые вещи при переходе с массивов, я думаю. Спасибо за помощь! – Mattycaeks

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