IMO, ItzWarty делает разумное замечание - вы можете просто оставить код в покое. Предполагая, что вы решаете, что изменить это хорошо, вы можете сделать что-то вроде этого:
class equipment {
public:
int getAttack();
int getDefense();
};
int PlayerCharacter::getBattleFactor(int (equipment::*get)()) {
int factor = level + 1;
for (int i=0; i<current_equipment; ++i)
factor += equipment[i].*get();
return factor * sqrt(level + 1);
}
Вы бы назвали это как:
int attack = my_player.getBattleFactor(&equipment::getAttack);
или
int defense = my_player.GetBattleFactor(&equipment::getDefense);
Edit:
Другой очевидной возможностью было бы постановление о том, что любая единица оборудования может только быть оборонительной или наступательной. В этом случае все становится еще проще, так что даже может быть сомнительно, нужна ли вам вообще функция:
class PlayerCharacter {
std::vector<equipment> d_equip;
std::vector<equipment> o_equip;
// ...
int d=level+1+std::accumulate(d_equip.begin(), d_equip.end(), 0)*sqrt(level+1);
int o=level+1+std::accumulate(o_equip.begin(), o_equip.end(), 0)*sqrt(level+1);