These are good things:
- modularization
- separation of concerns
- functional programming
- unit testing
I'd like to add
code reuse, which includes existing solutions to commonly known problems, as opposed to re-inventing wheels. This is probably why we're all in this forum
crdl_pls, you should have a look at how existing libraries implement the managers you're talking of: for example for
entity component systems (ECS), or
texture/resource managers from Thor.
But if you're more or less new to game development, forget about ECS for the moment. It's a hyped keyword, and many people praise it as the ultimate, one-fits-all solution, even though it brings its own range of problems and complexity. I suggest you go without ECS for a while, because only then you experience some of the problems that led to the creation of ECS yourself. You truly risk getting lost in overengineering when you apply complex patterns as a beginner or intermediate -- this doesn't only apply to ECS. It pays off to encounter new concepts with a bit of skepticism and actually ask yourself (and others), what advantages they bring and if they're worth the learning effort at that stage.
In game development, there's tons of more fundamental things to learn first. A really nice resource is
Game Programming Patterns. When it comes to C++ patterns, I have once
compiled a list of things I consider important.
Regarding concrete tips to your code: use actual constants in your constants header, use unique pointers, prefer .hpp headers (.h is usually C), have an in-depth look at the STL (which will be your working horse for the upcoming years), replace
if (x == false) with
if (!x).