1. To raczej niezbyt częsta konwencja nazywanie plików class_*.h. Bardziej zrozumiałe będzie combat.h, entity.h itp.
2. Jeśli będziesz miał rozszerzenia *.h w plikach nagłówkowych, niektóre (prostsze) narzędzia inspekcji kodu nie zorientują się że mają do czynienia z kodem C++
3. To zła praktyka emitować kod z pliku *.h (class_monster.h)
4. Być może to zamierzone ale wygląda dziwnie jeśli typ enum, ma wartości takie same dla więcej niż jednego elementu.
5. Stosuj "const correctness" czyli metody nie zmieniające stanu obiektu, powinny posiadać na końcu const.
6. To zadziwiające że metody o nazwach np. setStrength(), nie przyjmują żadnych parametrów a mają w nazwie set.
7. Pet czy Pets (liczba mnoga)?
8. Mam intuicję że część prywatnych atrybutów w klasach jest ... "niezręczna" ale bez kodu implementacji trudno coś powiedzieć.
Bez implementacji.. tyle.. Hmm.. jesteś pewien że dziedzicząc nie powodujesz konieczności stosowania virtual w niektórych metodach? (to bardzo ogólne pytanie)