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 maind 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
.