Pytanie o to, jak projektować klasy jest bardzo złożone. Jest mnóstwo książek na ten temat i one często dadzą Ci tylko heurystyki, nie gotowe reguły które będą zawsze działać. Polecam zacząć od książki Roberta C. Martina "Zwinne wytwarzanie oprogramowania. Najlepsze zasady, wzorce i praktyki". Ta lektura bardzo mocno zmieniła moje spojrzenie na architekturę.
Czy właściwe jest tylko podejście obiektowe, czy niektóre funkcjonalności można realizować nie zaprzęgając klasy?
To nie tak, że któreś podejście jest właściwe, a któreś nie. To jest narzędzie. Pytasz czy młotek jest bardziej poprawny od śrubokręta. Do wbijania gwoździ tak, do wkręcania śrubek nie :) Jeżeli chcesz napisać hello worlda, to napisz go imperatywnie, strukturalnie. main, cout << "Hello world". Koniec. (Tu się w ogóle można spierać czy to nie jest program obiektowy, bo przecież std::cout to obiekt; jeżeli Ci to przeszkadza, to wyobraź sobie użycie std::printf zamiast std::cout). Jak by to wyglądało obiektowo? class Printer? class Message? Printer::print(const Message&)... Wiesz, obiektówka dokłada Ci do kodu złożoności, ale pozwala Ci rozwiązywać inne problemy. Pozwala Ci myśleć o programie jako o zbiorze urządzeń (obiektów), które potrafią dobrze robić swoją robotę i ze sobą gadają, żeby wykonać zadanie. Pozwala poprawić czytelność programu, (pozwala też pogorszyć). Na tym się nie kończy lista zalet obiektówki, ale nie mam na tyle wiedzy i czasu żeby wszystko tu wyłożyć :)
Z mojego doświadczenia: pisanie w sposób obiektowy na samym początku zajmuje więcej czasu niż gdyby to olać i robić wszystko w mainie, makaronem, ale z czasem, gdy projekt rośnie i staje się coraz bardziej złożony, panowanie nad nim staje się cholernie trudne. Jeżeli wiesz, że projekt ma być duży, albo po prostu chcesz sobie poćwiczyć obiektówkę, to pisz obiektowo :) W moich małych programach które użyję tylko raz raczej nie stosuję tego podejścia i piszę tak zwanym makaronem :) A oczywiście istnieją jeszcze inne paradygmaty: funkcyjny czy generyczny (i tu lista się nie kończy). One mają swoje zalety i wady, ale o nich za wiele się nie wypowiem, bo najwięcej siedzę w obiektówce. No i w C++ możesz te paradygmaty ze sobą mieszać, w zależności od potrzeb :)
Najpierw dowiedz się po co Ci ta obiektówka. Bo na chwilę obecną wiesz tylko, że chcesz przy budowie swojego programu użyć śrubokręta :) Dowiedz się do czego on służy, co Ci daje :) Może wyjść tak, że będziesz wbijał gwoździe śrubokrętem jak się go ślepo złapiesz :)