Z main do świata obiektów

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

.