Program główny w języku C++ to dalej klasyczna, nieskładowa funkcja main
. Bardzo często pojawia się wątpliwość jak zorganizować program, który „przeskoczy” z nieobiektowego main do świata programowania obiektowego.
Najczęściej spotykanym rozwiązaniem jest zdefiniowanie klasy reprezentującej program, utworzenie jej obiektu i aktywowanie wybranej funkcji składowej, przejmującej kontrolę nad wykonaniem programu, np.:
int main() { MyProgram program; program.run(); return EXIT_SUCCESS; }
Jeżeli założymy, że rezultatem funkcji składowej run będzie wartość zgodna z konceptem rezultatu funkcji main (np. EXIT_SUCCESS
, EXIT_FAILURE
), możemy zorganizować funkcję main w następujący sposób:
int main() { MyProgram program; return program.run(); }
Tego typu rozwiązanie przejścia od nieobiektowego main
d o świata obiektowego wykorzystywane jest we wielu obiektowych bibliotekach języka C++, np. w bibliotece Qt.
Jak możemy zdefiniować klasę MyProgram
? Może ona wyglądać np. tak:
class MyProgram { public: MyProgram() { // Tutaj czynności inicjalizacyjne programu std::cout << "Witaj!" << std::endl; } ~MyProgram() { // Tutaj czynności kończące programu std::cout << "Do widzenia!" << std::endl; } int run() { // Tu uruchomienie właściwych akcji programu std::cout << "Nacisnij Enter by zakonczyc..." << std::endl; std::cin.get(); return EXIT_SUCCESS; } };
Ciekawostka
Z uwagi na automatyzm aktywowania konstruktorów, również dla obiektów globalnych, przedstawiony niżej program uruchomi funkcję run
przed wykonaniem pustej funkcji main
.
#include <cstdlib> #include <iostream> class MyProgram { public: MyProgram() { // Tutaj czynności inicjalizacyjne programu std::cout << "Witaj!" << std::endl; run(); } ~MyProgram() { // Tutaj czynności kończące programu std::cout << "Do widzenia!" << std::endl; } int run() { // Tu uruchomienie włąściwych akcji programu std::cout << "Nacisnij Enter by zakonczyc..." << std::endl; std::cin.get(); return EXIT_SUCCESS; } }; MyProgram program; int main() { return EXIT_SUCCESS; }
Destruktor klasy MyProgram
zostanie uruchomiony po zakończeniu funkcji main
.