Pierwszy raz piszę w C++ większy projekt (do tego w nowym dla mnie środowisku VS 2019) i nie do końca mam pomysł na rozwiązanie pewnego problemu.
Chcę stworzyć silnik graficzny, który będę mógł wykorzystać później do innych projektów. Chciałbym, żeby całość opierała się na jednej klasie abstrakcyjnej Engine
, w taki sposób, by praca z silnikiem sprowadzała się do nadpisania kilku funkcji z tej klasy, np. OnKeyDown()
albo OnFrameUpdate()
. Klasa ta, w swoim konstruktorze, tworzy inne klasy pomocnicze (np. klasę okna), a one tworzą dalsze klasy im podległe i powstaje taka piramidka: Engine --> MainWindow --> Display --> Buffer
itd. Co ważne, klasy te w momencie utworzenia przechwytują i przechowują referencje do klasy bazowej Engine
, dzięki czemu mają dostęp do siebie nawzajem (są zaprzyjaźnione) i np. MainWindow
może w swojej funkcji obsługi komunikatów (WndProc
), wykorzystywać funkcje, które znajdują się bezpośrednio w Engine
(jak chociażby abstrakcyjne OnKeyDown()
, które może być wykonywanie w momencie odebrania komunikatu WM_KEYDOWN
). Mógłbym taką funkcję OnKeyDown()
umieścić bezpośrednio w klasie MainWindow
, ale wtedy praca z silnikiem wymagałaby nadpisania kilku klas, a mi zależy na prostocie.
Wszystko niby OK, tylko z jedną rzeczą nie mogę sobie dać rady. Otóż wszystkie te klasy siedzą w jednym pliku nagłówkowym, bo nie znalazłem sposobu jak trzymać je osobno (rozbijając np. na MainWindow.h i Engine.h) i jednocześnie uniknąć circular reference
(by te klasy mogły wzajemnie z siebie korzystać). Da się to zrobić? A może w ogóle zabieram się do tego od niewłaściwej strony i powinienem był to inaczej zaprojektować? Proszę o poradę jak to się powinno zrobić bardziej profesjonalnie.
forward declaration
, ale tak jak piszesz, dostęp do pól wymaga pełnej deklaracji, a u mnie taki właśnie dostęp jest potrzebny ;/.