From what I’ve read this error usually happens when iterators go out of bounds, but I’m getting this problem on an empty vector.
This is the Player class that holds the vector:
Player.h:
#pragma once
#include "Item.h"
#include "Room.h"
#include <vector>
#include <memory>
#include <string>
using namespace std;
class Player
{
private:
int health;
string name;
shared_ptr<Room> currentRoom;
vector<shared_ptr<Item> > inventory;
public:
Player(void);
Player(string);
~Player(void);
void changeHealth(int);
void setRoom(shared_ptr<Room>);
shared_ptr<Room> getRoom();
unsigned int getInventorySize();
};
Player.cpp:
#include "Player.h"
#include <iostream>
#include <memory>
#include <string>
Player::Player(void)
{
health = 20;
}
Player::Player(string newName)
{
name = newName;
}
Player::~Player(void)
{
}
void Player::changeHealth(int amount){
health += amount;
}
void Player::setRoom(shared_ptr<Room> newRoom){
currentRoom = newRoom;
}
shared_ptr<Room> Player::getRoom(){
return currentRoom;
}
unsigned int Player::getInventorySize(){
return inventory.size();
}
I commented out every other method in Player that affects inventory. In main, I make a player object, but I don’t do anything to inventory so it should be completely empty, and getInventorySize should return 0, right? But when I do this:
cout<<player->getInventorySize();
The program crashes with a vector subscript out of range error. What’s going on? =\
full main:
#include "World.h"
#include "Player.h"
#include "Room.h"
#include "Item.h"
#include "Option.h"
#include "RoomOption.h"
#include <iostream>
#include <memory>
#include <string>
#include <stdlib.h>
typedef shared_ptr<Option> optionPtr;
typedef shared_ptr<Item> itemPtr;
typedef shared_ptr<Room> roomPtr;
const int healthPackID =0;
World world;
void createWorld(void);
void main(){
createWorld();
shared_ptr<Player> player = world.getPlayer();
int selection = 0, inventoryOption = 0, exitOption = 0;
do{
inventoryOption = player->getRoom()->getNumOptions() + 1;
exitOption = inventoryOption + 1;
cout<<player->getRoom()->getDescription()<<endl;
player->getRoom()->printOptions();
cout<< inventoryOption <<". View Inventory"<<endl;
cout<< exitOption <<". Quit game"<<endl<<endl;
cin>>selection;
string optionType = typeid(*(player->getRoom()->getOption(selection- 1).get())).name();
if(selection == inventoryOption){
cout<<player->getInventorySize();
}
else if( optionType.compare("class RoomOption") == 0){
player->setRoom(player->getRoom()->getOption(selection- 1)->getRoom());
cout<< "RoomOption!"<<endl;
}
else{
cout<< "Not RoomOption =("<<endl;
}
system("CLS");
}while(selection != exitOption);
}
void createWorld(){
shared_ptr<Player> player(new Player("Ted"));
world.setPlayer(player);
roomPtr outside(new Room(0, "You're outside", ""));
roomPtr hallway(new Room(1, "It's a hallway", ""));
roomPtr kitchen(new Room(2, "It's the kitchen", ""));
roomPtr livingRoom(new Room(3, "You're in the living room", ""));
roomPtr upstairs(new Room(4, "You're on the upstairs landing but all the doors are barred shut", ""));
outside->addOption(optionPtr(new RoomOption(0, "Go inside", hallway)));
hallway->addOption(optionPtr(new RoomOption(0, "Go straight ahead into the kitchen", kitchen)));
hallway->addOption(optionPtr(new RoomOption(1, "Go right into the living room", livingRoom)));
hallway->addOption(optionPtr(new RoomOption(2, "Go upstairs", upstairs)));
hallway->addOption(optionPtr(new RoomOption(3, "Go back outside", outside)));
hallway->addItem(itemPtr(new Item(healthPackID, "Health Pack", "A pack full of first aid items like bandages and surgical spirits. Use it to increase your health", 3)));
kitchen->addOption(optionPtr(new RoomOption(0, "Go right into the living room", livingRoom)));
kitchen->addOption(optionPtr(new RoomOption(1, "Go back into the hallway", hallway)));
kitchen->addItem(itemPtr(new Item(1, "Cake", "A piece of tasty cake", 1)));
kitchen->addItem(itemPtr(new Item(2, "Beer", "A cold bottle of generic brand beer", 1)));
livingRoom->addOption(optionPtr(new RoomOption(0, "Go left into the kitchen", kitchen)));
livingRoom->addOption(optionPtr(new RoomOption(1, "Go back into the hallway",hallway)));
upstairs->addOption(optionPtr(new RoomOption(0, "Go back downstairs", hallway)));
world.addRoom(outside);
world.addRoom(kitchen);
world.addRoom(livingRoom);
world.addRoom(hallway);
world.addRoom(upstairs);
player->setRoom(outside);
}
Since you are adding two extra options, those two options are not contained within the options vector of the room, causing an index out of bounds error. You should check whether the selection is valid before calling
getOption.You should first check
selection == inventoryOption, and if it is not (and it is not the exit option either), then calculateoptionType. Better still, before calculatingoptionType, make sure thatselectionis a valid number, otherwise you will get the same problem if a user enters an invalid number.