2015-04-22 5 views
-2

Этот код похож на пару сообщений уже здесь, однако у меня есть уникальная проблема. Связанный список вызывает исключение при попытке вставить объект. Должно быть 5 игроков, каждый из которых имеет различное количество оружия, каждое оружие имеет разное количество раундов. Я в недоумении. Пожалуйста помоги!LinkedList вызывает исключение, но не уверен, почему?

LinkedList.h

template <class T> 
class LinkedList { 
public: 
T *first; 
LinkedList(); 
~LinkedList(); 
inline bool IsEmpty(); 
inline void Insert(T *); 
void Display()const; 
T *Find(const int key)const; 
T *Delete(); 
T *Delete(const int key); 
}; 

template <class T> 
LinkedList<T>::LinkedList(){ 
     first = 0; 
} 

template <class T> 
LinkedList<T>::~LinkedList(){ 

} 

template <class T> 
bool LinkedList<T>::IsEmpty(){ 
    return (first == 0); 
} 

template <class T> 
void LinkedList<T>::Insert(T * newLink){ 
    newLink->next = first; //exception break highlights here 
    first = newLink; 
} 

template <class T> 
void LinkedList<T>::Display()const { 
       T *current = first; 
       while (current != 0) { 
       current->Display(); 
       current = current->next; 
       } 
} 

template <class T> 
T *LinkedList<T>::Find(const int key)const { 
       T *current = first; 
       while (current->data != key){ 
        if (current->next == 0) 
         return 0; 
        else 
         current = current->next; 
       } 
       return current; 
} 

template <class T> 
T *LinkedList<T>::Delete() { 
       T *temp = first; 
       first = first->next; 
       return temp; 
} 

Player.h

class Player:public GameObject 
{ 
public: 
Player* leftChild; 
Player* rightChild; 
LinkedList<Weapon>* weapons; 
Player(); 
~Player(); 
void Display(); 
bool operator != (const Player&); 
bool operator <(const Player&); 
}; 

Player.cpp

Player::Player() 
{ 
leftChild = 0; 
rightChild = 0; 
} 

Player::~Player() 
{ 
} 

void Player::Display() 
{ 
} 

bool Player::operator<(const Player& player) 
{ 
if (this->instances < player.instances) 
{ 
    return true; 
} 
else 
{ 
    return false; 
} 
} 

bool Player::operator!=(const Player& player) 
{ 
if (instances == NULL) 
{ 
    return false; 
} 
else 
{ 
    return true; 
} 
} 

main.cpp

int main() 
{ 
Player *players[4]; 
players[0] = new Player(); 
players[1] = new Player(); 
players[2] = new Player(); 
players[3] = new Player(); 
players[4] = new Player(); 
players[0]->weapons->Insert(new Weapon(1)); 
} 

Надеюсь, я включил все. Я понятия не имею, что я сделал не так, или куда идти отсюда.

+0

Что означает «оружие» в новом «Player»? (Последующий вопрос: почему это указатель?) – molbdnilo

+0

какое исключение? –

+2

«Надеюсь, я включил все». На самом деле вы включили слишком много. Я уверен, что 90% кода не относится к исключению. С другой стороны, вы включили слишком мало, потому что вы не говорите нам, что является исключением. – user463035818

ответ

2

Вы не создаёте объект оружия в конструкторе Player.cpp:

Player::Player() 
{ 
    leftChild = 0; 
    rightChild = 0; 
    weapons = new LinkedList<Weapon>; 
} 

Вы также могли бы сделать сбор оружия поле без указателей было бы проще в управлении для вас. Также рекомендуется использовать коллекцию STL вместо своего собственного (меньше риск неприятных исключений) ...

Edit: Да MrYellow прав. Попробуйте использовать list<Weapon> вместо вашего LinkedList<Weapon>, который реализует хорошие push_front и push_back методы, также стараются избегать указателей, если вы действительно не видите цель их использования ...

+0

Большое вам спасибо. Я пропустил это полностью.Все, что я должен знать, это выяснить, как дать им оружие, раунды, отдельные идентификаторы и отобразить их на консоли. Надеюсь, я смогу понять это. Опять же. Спасибо! –

+0

Это не единственная проблема! Когда я просматриваю ваш метод Insert вашего класса LinkedList, у меня начинает болеть голова. Вы хотите вставить объект newLink и сначала установить следующий элемент этого нового элемента?!? и после этого ваш первый станет объектом newLink (это будет действительным для первого элемента, который вы вставляете, но что со вторым объектом и т. д.)? Это не связанный список вообще! –

+0

@ Mr.Yellow Я честно не знаю достаточно о C++, чтобы знать, что с ним что-то не так. файлы LL, стек и дерево, я просто должен сделать все остальное ... как-то. –

0

Вам нужно выделить weapons также. Например, в проигрывателе() конструктор:

Player::Player() { 
    leftChild = 0; 
    rightChild = 0; 
    weapons = new LinkedList<Weapon>; 
} 

В противном случае players[0]->weapons указывает на недопустимый указатель, который вызывает исключение.

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