Se modifichi così:
void Game:: start(){
associate_monster_f();
_attack_f=_f->choose_attack( (associate_attack_f(_monster_list_f.at(_indicator_monster_f).ID())));
}
Noterai che viene lanciata un'eccezione (cosa che non succede usando l'operatore[]).
Il banale motivo risiede qui:
void Game:: associate_monster_f(){
Fighter f;
vector<Monster> *tmp;
tmp=f.return_monsters(); // il vector però è vuoto se non è riempito dal costruttore di Fighter.
for(unsigned int j=0; j<tmp->size();++j ) { // quindi questo ciclo non sarà mai eseguito.
for(unsigned int i=0; i<_player.size();++i ){
if(_player[i].ID_monster()==tmp->at(j).ID() ){
_monster_list_f.push_back(tmp->at(j));
}
}
}
}
e di conseguenza
_monster_list_f è vuoto. Il che da l'errore di cui ti lamenti.
N.B.
Dato che
_monsters non è un puntatore, invece di
vector <Monster> *Fighter:: return_monsters(){
return &_monsters;
}
puoi scrivere:
vector <Monster>& Fighter:: return_monsters(){
return _monsters;
}
risparmiando la sintassi dei puntatori in seguito (a meno di specifiche diverse, un pò forzate in questo caso).